2015-09-13 1 views
0
char x[3]; 
char buff, c; 
x[0]='y'; 
int offset, i; 
int fd; 

fd = open("test1.txt", O_RDONLY); 
if(fd==-1){ printf("Error on fopen."); exit(1); } 

offset = lseek(fd, 1, SEEK_END); 
printf("Size of file is: %d. \n", offset); 

for(i=offset-1; i>=0; i--) 
{ 
    c = read(fd, &buff, 1); 
    printf("The character is: %c. \n", c); 
} 

close(fd); 

En cours d'exécution cela me donne.L'utilisation de lseek() imprime des caractères répétés

Size of file is: 6. 
The character is: . 
The character is: . 
The character is: . 
The character is: . 
The character is: . 
The character is: . 

Le fichier de test contient uniquement le mot "TEST". Je veux être en mesure d'imprimer le mot en arrière.

+0

Vous avez oublié de revenir en arrière ou de rechercher le pointeur de fichier. Vous lisez de la fin du fichier. –

+3

Eh bien pour une chose que vous imprimez la valeur de retour de 'read' qui n'est pas le caractère lu. Voir http://linux.die.net/man/2/read – missimer

Répondre

0

read lit à la position actuelle et déplace la position actuelle vers l'avant de la quantité lue.

Il doit y avoir d'autres recherches. Aussi lseek(..., 1, SEEK_END); devrait probablement être lseek(...,0, SEEK_END); Je serais mal à l'aise avec la recherche d'au-delà du fichier.

for(i = ...) { 
    lseek(fd, size - i, SEEK_BEGIN); 
    read(...); 
} 
0

Utilisez fstat() pour obtenir la taille du fichier, comme lseek()-SEEK_END n'est pas garanti pour retourner la taille d'un fichier, et vous pouvez utiliser pread() pour lire un fichier en sens inverse, sans avoir à faire une recherche du tout. C'est sans vérification d'erreur - qui devrait être ajouté à tout code qui va être utilisé:

struct stat sb; 
int fd = open("test1.txt", O_RDONLY); 
fstat(fd, &sb); 
while (sb.st_size > 0) 
{ 
    char buff; 
    sb.st_size--; 
    pread(fd, &buff, sizeof(buff), sb.st_size); 
    printf("Char read: %c\n", buff); 
} 
close(fd);