Utter Stupidity

I feel utterly stupid asking this question, especially since I have been programming in C for almost 3 years now;  but it's really bugging me.  I am using G++ under FreeBSD 2.1.6; here is the main source to the loop:

  while (!feof(infile1)) {
    fgets(s1, 4096, infile1);
    fgets(s2, 4096, infile2);
    if (strlen(s1)==strlen(s2)) {
      if (strcmp(s1, s2)==0) fputs(s1, outfile);
    }
  }

All of the files are opened correctly, the variables are typecast correctly, etc -- it's nothing to do with simple mechanics. Unfortunately, it seems like this loop NEVER exits.  I've monitored feof(infile) to see when the EOF is set and it's detecting it; however, the loop never exits.  As a result, the program crashes with "Segmentation Fault (Core Dump)".  It doesn't lock the computer and the output file is always 100% correct -- it just doesn't ever want to quit.

The data I am working with is just two simple text files.  This loop is supposed to compare the two files (in text mode), line by line, and write any matching lines to the output file.
hooptieAsked:
Who is Participating?

[Product update] Infrastructure Analysis Tool is now available with Business Accounts.Learn More

x
I wear a lot of hats...

"The solutions and answers provided on Experts Exchange have been extremely helpful to me over the last few years. I wear a lot of hats - Developer, Database Administrator, Help Desk, etc., so I know a lot of things but not a lot about one thing. Experts Exchange gives me answers from people who do know a lot about one thing, in a easy to use platform." -Todd S.

jos010697Commented:
For one thing, the logic of your program fragment is faulty,
i.e. the feof() function does not _predict_ whether or not
the next read would bump into an eof condition, it just
tells you if the last read encountered an eof condition.

If the fgets() function bumps into an eof condition (withouit
having read anything), it returns a NULL pointer value.

Something like the following would do the job for you:

while (fgets(s1, 4096, infile1) && fgets(s2, 4096, inflie2)) {
   /* process the lines read */

if (feof(infile1))
   if (!feof(infile2))
      /* infile1 was shorter ... */
/* etc. */

kind regards,

Jos aka jos@and.nl
0

Experts Exchange Solution brought to you by

Your issues matter to us.

Facing a tech roadblock? Get the help and guidance you need from experienced professionals who care. Ask your question anytime, anywhere, with no hassle.

Start your 7-day free trial
It's more than this solution.Get answers and train to solve all your tech problems - anytime, anywhere.Try it for free Edge Out The Competitionfor your dream job with proven skills and certifications.Get started today Stand Outas the employee with proven skills.Start learning today for free Move Your Career Forwardwith certification training in the latest technologies.Start your trial today
C++

From novice to tech pro — start learning today.