/* Programme pour afficher "instantanement" la i-ème ligne d'un fichier en * s'appuyant sur son fichier d'index cree avec gli.c * Syntaxe : * glMmap nomFichier numLigne * * Résultat : * Affichage de la ligne numéro numLigne de nomFichier * * A la difference de gl, glMmap utilise mmap sur le fichier d'index */ #include #include #include #include #include #include #include #include int main(int argc, char *argv[]) { FILE *source; int idx; char nameIdx[1024]; char ligne[1025]; /* On suppose que les lignes font au plus 1024 caractères (1025-sizeof('\0') */ int numLigne; int longueurLigne; int *tabIdx; if (argc != 3) { fputs("USAGE = glMmap nomFichier numLigne\n", stderr); exit(1); } /* Ouverture source */ source = fopen(argv[1], "r"); if (source == NULL){ perror("fopen source"); exit(1); } /* Ouverture idx */ strcat(strcpy(nameIdx,argv[1]), ".idx"); idx = open(nameIdx, O_RDONLY); if (idx < 0){ perror("open"); exit(1); } tabIdx = (int *)mmap(0, sizeof(int), PROT_READ, MAP_PRIVATE, idx, 0); if (tabIdx == MAP_FAILED){ perror("mmap"); exit(1); } /* Calcul de numLigne */ numLigne = atoi(argv[2]); /* Lecture de la i-ème ligne du fichier */ if (fseek(source, tabIdx[numLigne]*sizeof(char), SEEK_SET) < 0){ perror("fseek source"); exit(1); } longueurLigne = tabIdx[numLigne+1]-tabIdx[numLigne]; if (fread(ligne, sizeof(char), longueurLigne, source) != longueurLigne) { perror("fread source"); exit(1); } /* On met un '\0' à la fin de ligne, sinon ça fait désordre... */ ligne[longueurLigne] = '\0'; /* Affichage du résultat */ printf("Ligne %d = \"%s\"\n", numLigne, ligne); /* Libération ressources */ if (fclose(source) < 0){ perror("fclose source"); exit(1); } if (close(idx) < 0){ perror("close idx"); exit(1); } return 0; }