2013-07-15 4 views
5

Предполагая, что у нас есть текстовый файл с именем hi.txt, который содержит следующую строку:Неожиданный выход при использовании FSEEK

AbCdE12345

Пусть говорят, что мы запускаю этот код:

int main() { 
    FILE *fp; 
    fp = fopen("hi.txt","r"); 
    if(NULL == fp) { return 1; } 
    fseek(fp,-1, SEEK_END); 
    while (ftell(fp) > 0) { 
    printf("%c",fgetc(fp)); 
    fseek(fp,-4, SEEK_CUR); 
    } 
    fclose(fp); 
    return 0; 
} 

Когда я запустил этот код, он напечатал: 3EbCd

Когда я попытался угадать, что он будет печатать Я думал, что это должно быть 52d. Может ли кто-нибудь объяснить, что здесь произошло?

ответ

15

Похоже, что в конце вашего файла есть непечатаемый символ конца строки. Это то, что печатается первым. Затем позиция перемещается по очереди на 3, E и b. На этом этапе повторное позиционирование по -3 терпит неудачу, так как местоположение будет -2. Файловый курсор остается там, где он был, то есть на C, который печатается следующим образом. Следующая попытка повторного позиционирования тоже не работает, поэтому печатается d. Следующее повторное позиционирование завершается, завершая цикл.

Для выявления ситуаций, когда fseek игнорируется, проверить возвращаемое значение, например:

while (ftell(fp) > 0) { 
    printf("%c",fgetc(fp)); 
    // Successful calls of fseek return zero 
    if (fseek(fp,-4, SEEK_CUR)) { 
     // Exit the loop if you can't jump back by 4 positions 
     break; 
    } 
} 
+0

Это работает !! Благодаря !!! – Robert777

4

Для файлов, открытых в текстовом режиме смещение передается fseek имеет смысл только для значений, возвращаемых ftell. Таким образом, смещение не обязательно должно быть в байтах. Попробуйте открыть файл в двоичном режиме:

fp = fopen("hi.txt", "rb"); 

и посмотреть, будут ли результаты отличаться.

Смежные вопросы