2015-09-13 3 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); 

Выполнение этого дает мне.Использование lseek() печатает повторяющиеся символы

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

В тестовом файле содержится только слово «TEST». Я хочу, чтобы иметь возможность печатать слово назад.

+0

Вы забыли перемотать или искать указатель файла. Вы читаете из конца файла. –

+3

Ну, для одной вещи вы печатаете возвращаемое значение 'read', которое не является символом, читаемым. См. Http://linux.die.net/man/2/read – missimer

ответ

0

read считывает текущую позицию и перемещает текущую позицию вперед на считанное количество.

Должны быть дальнейшие поиски. Также lseek(..., 1, SEEK_END);, вероятно, должно быть lseek(...,0, SEEK_END); Мне было бы неудобно с поиском за пределами файла.

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

Использование fstat() для получения размера файла, так как lseek() к SEEK_END не гарантируется вернуть размер файла, и вы можете использовать pread() для чтения файла в обратном направлении без необходимости делать какие-либо ищет на всех. Это без каких-либо проверок ошибок, которые должны быть добавлены в любой код, который будет использоваться:

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);