简体   繁体   中英

feof, doesn't seem to work - text files

I'm reading lines from a text file using fgets();

I have a loop with: while(!feof(fp))

The thing is, the program keeps entering the loop even after I've reached and read the last line, and in debug the file ptr shows only dots and not a string of data.

How can I get it to know I've reached the end and not enter the loop again?

        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,","));
            }

        }

There are only 2 lines in the text file, I'm using fseek and going to the begining of the file then I use fprintf twice and write on those lines, after that I should reach the EOF

Do you mean it enters the loop once?

feof(fp) returns true if the program has attempted to read beyond the end of file, not when it's read up to it. The system doesn't necessarily know if there's more of a file (it may be dynamically generated, stdin being the canonical example), but does know if it hit an end of file.

You need to test feof(fp) after each fgets(fp) , or test to see how many characters were returned by fgets(fp) , or do a one-character get and unget .

Well I use this custom function....

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

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM