[Webinar] Learn how to a build a cloud-first strategyRegister Now

x
  • Status: Solved
  • Priority: Medium
  • Security: Public
  • Views: 231
  • Last Modified:

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.
0
hooptie
Asked:
hooptie
1 Solution
 
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

Featured Post

Vote for the Most Valuable Expert

It’s time to recognize experts that go above and beyond with helpful solutions and engagement on site. Choose from the top experts in the Hall of Fame or on the right rail of your favorite topic page. Look for the blue “Nominate” button on their profile to vote.

Tackle projects and never again get stuck behind a technical roadblock.
Join Now