开发者

C program to merge files not finding EOF, stuck in infinite loop!

I'm having some problems trying to run this program I am working on...The requirements say I was not allowed to use a sort function...I had do something myself....etc.

Pretty much, the program compiles but hangs after executed...I'm guessing it's stuck in an infinite loop..开发者_如何学C.but I can't seem to find it... :(

This program reads to data files that will already be ordered least to greatest and merges them (ordered) into a third .txt file...

The two files are Data1.txt and Data2.txt contains:

Data1.txt

2
2
2
2

Data2.txt

1
3
5
7
9

combine.c

#include <stdio.h>
#include <stdlib.h>


void sortData(FILE *fpData1, FILE *fpData2)
{

 int n, m; 
 FILE *fpMerge;


 fpMerge = fopen("Merge.txt", "w+");


 fscanf(fpData2, "%i", &n);
 fscanf(fpData1, "%i", &m);
 while(n != EOF || m != EOF)
 {

  if(n == EOF)
  {
   fscanf(fpData1, "%i", &m);

   while(m != EOF)
   {

    fprintf(fpMerge, "%i\n", m);
    fscanf(fpData1, "%i", &m);
   }
  }
  if(m == EOF)
  {
   fscanf(fpData2, "%i", &n);

   while(n != EOF)
   {

    fprintf(fpMerge, "%i\n", n);
    fscanf(fpData2, "%i", &n);
   }

  }

  if(n < m)
  {
   fprintf(fpMerge, "%i\n", n);
   fscanf(fpData2, "%i", &n);
  }
  if(n > m)
  {
   fprintf(fpMerge, "%i\n", m);
   fscanf(fpData1, "%i", &m);
  }
  if(n == m)
  {
   fprintf(fpMerge, "%i\n", n); 
   fprintf(fpMerge, "%i\n", m);
   fscanf(fpData2, "%i", &n);
   fscanf(fpData1, "%i", &m);

  }
 }

 fclose(fpMerge);
}

int main (void)
{
 FILE *fpData1;
 FILE *fpData2;


 fpData1 = fopen("Data1.txt", "r");
 if(fpData1 == NULL)
 {
  printf("There was an error opening the file...program terminating..\n");
  exit(1);
 }

 fpData2 = fopen("Data2.txt", "r");
 if(fpData2 == NULL)
 {
  printf("There was an error opening the file...program terminating..\n");
  exit(1);
 }



 sortData(fpData1, fpData2);


 fclose(fpData1);
 fclose(fpData2); 

 return 0;
}


You don't want to compare n != EOF, but rather the return value of fscanf:

int count_1;
count_1 = fscanf(fpData1, "%i", &m);
if (count_1 == EOF) // EOF (or error)
{
  // ...
}

fscanf will also return EOF on error. If you need to tell EOF and error conditions apart, use ferror(fpData1), say, and then look up the error code (stored in errno).


Your testing of EOF is not quite correct

void sortData(FILE *fpData1, FILE *fpData2)
{
    int data1;
    int data2; 
    FILE *fpMerge;

    fpMerge = fopen("Merge.txt", "w+");
    fscanf(fpData1, "%i", &data1);
    fscanf(fpData2, "%i", &data2);

    // While one file still has data        
    while(!feof(fpData1) && !feof(fpData2))
    {
        // Choose 1 file to test
        // Read from that file and put into merge file until either we
        // run out of data or the condition fails.
        if(data1 < data2)
        {
            do {fprintf(fpMerge, "%i\n", data1);}
            while ((fscanf(fpData1, "%i", &data1) != 0) && (data1 <= data2));
        }
        else
        {
            do {fprintf(fpMerge, "%i\n", data2);}
            while ((fscanf(fpData2, "%i", &data2) != 0) && (data2 <= data1));
        }
        // NOTE: if fscanf() returns 0 it has failed to read (EOF)
    }
    // One of the files has reached the EOF
    // Dump the other file.
    while(fscanf(fpData1, "%i", &data1) != 0) {fprintf(fpMerge, "%i\n", data1);}
    while(fscanf(fpData2, "%i", &data2) != 0) {fprintf(fpMerge, "%i\n", data2);}
}


EOF is not a character.
EOF is not an integer.
No files will ever have EOF (neither char nor int) in them.

EOF is a condition.
Files will either be on that condition or (usually) not.

You should check the return value of fscanf() to detect EOF or other problems.

0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜