кажется, не работает - текстовые файлы - PullRequest
0 голосов
/ 18 марта 2011

Я читаю строки из текстового файла, используя fgets();

У меня есть цикл с: while(!feof(fp))

Дело в том, что программа продолжает вводить цикл даже после того, как яВы достигли и прочитали последнюю строку, и при отладке в файле ptr отображаются только точки, а не строка данных.

Как узнать, что я достиг конца, и больше не входить в цикл?

        while (!feof(fp)) {
            if (strcmp(data2->ID ,data1->ID)<0) {

                fseek(fp, backTo, SEEK_SET);
                fprintf( fp, "%s",lin2);
                fprintf( fp, "%s",lin1);

                flag = 1;
            } 
            else 
            {
                strcpy(data1->ID,data2->ID);
                strcpy(data1->name,data2->name);
                data1->price=data2->price;

            }

            if(fgets(line2, sizeof(line2),fp)!=NULL)
            {
                itemSize2=strlen(line2)+1;
                strcpy(data2->ID,strtok (line2,","));
            }

        }

В текстовом файле всего 2 строки, я использую fseek и перехожу к началу файла, затем дважды использую fprintf и пишу по этим строкам, после чего я должен добраться доEOF

Ответы [ 2 ]

4 голосов
/ 18 марта 2011

Вы имеете в виду, что он входит в цикл один раз?

feof(fp) возвращает значение true, если программа попыталась прочитать за пределами конца файла, а не при чтении до него.Система не обязательно знает, есть ли еще файл (он может быть сгенерирован динамически, stdin является каноническим примером), но она знает, попал ли он в конец файла.

Вам необходимо проверитьfeof(fp) после каждого fgets(fp) или проверьте, сколько символов было возвращено fgets(fp), или выполните односимвольные get и unget.

0 голосов
/ 30 марта 2013

Ну, я использую эту пользовательскую функцию ....

BOOL    CheckFileEnd(FILE *fp)
{
    BOOL res;
    long currentOffset = ftell(fp);

    fseek(fp, 0, SEEK_END);

    if(currentOffset >= ftell(fp))
        res = TRUE;
    else
        res = FALSE;

    fseek(fp, currentOffset, SEEK_SET);

    return res;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...