Reading from file using fgets
Asked Answered
R

2

16

I am reading from file of format

1 32 43 23
32 43
123 43 54 243 
123 2222
2

Here is my code snippet.

string[100];
while(!feof(fp))
    fgets(string,100,fp)

Now, when I put every string, in the last string I am getting repetition and some more ambiguities (like something else also gets printed say 123 or so).

How to solve this problem?

Ransom answered 24/2, 2012 at 16:20 Comment(2)
Is there an end-of-line \n character at the end of the last line in your file?Hardenberg
Post your full actual code, this shouldn't even compile.Sarge
H
27

You need to check the return value of fgets. If a read has been successful, fgets returns the pointer to the buffer that you passed to it (i.e. string in your example). If the End-of-File is encountered and no characters have been read, fgets returns NULL.

Try this:

char string[100];
while(fgets(string, 100, fp)) {
    printf("%s\n", string);
}
Hardenberg answered 24/2, 2012 at 16:23 Comment(5)
Why would you test with feof if fgets does so?Capstan
@ManuelReis You are right, feof test s unnecessary (edited).Hardenberg
Thanks for the answer, I was having an existential crisis for a second.Capstan
The \n inside issued by the printf is not necessary, as it already comes via fgets() from inside the file (if around).Dyspnea
Having fgets() return value assumed to be 0, this code works. Generally NULL is not necessarily 0, it is generally (void*)0. Code is more readable, if you check with NULLBrag
M
7

The eof is only reached after you have attempted to read from a file that is at the end. You have to use the return value of fgets instead (which returns NULL on eof or error and the pointer it is given otherwise):

char string[100];
while(fgets(string, 100, fp))
    // do stuff with string

Checking the return value like this will cause you never to hit the eof inside the body of the loop, like the other one, instead of in the condition.

Mcguigan answered 24/2, 2012 at 16:23 Comment(0)

© 2022 - 2024 — McMap. All rights reserved.