C программой для слияния файлов, не найдя EOF, застрял в бесконечном цикле! - PullRequest
1 голос
/ 08 сентября 2010

У меня проблемы с запуском этой программы, над которой я работаю ... В требованиях говорится, что мне не разрешили использовать функцию сортировки ... Я сам что-то сделал .... и т.д.

Практически, программа компилируется, но зависает после выполнения ... Я предполагаю, что она застряла в бесконечном цикле ... но я не могу найти ее ...: (

Этопрограмма считывает файлы данных, которые уже упорядочены по наименьшему значению, и объединяет их (упорядоченные) в третий файл .txt ...

Два файла: Data1.txt, а Data2.txt содержит:

Data1.txt

2
2
2
2

Data2.txt

1
3
5
7
9

объединить.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;
}

Ответы [ 3 ]

7 голосов
/ 08 сентября 2010

Вы не хотите сравнивать n != EOF, а возвращаемое значение fscanf:

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

fscanf также вернет EOF при ошибке.Если вам нужно разделить EOF и условия ошибок, используйте, скажем, ferror(fpData1), а затем найдите код ошибки (хранится в errno).

1 голос
/ 09 сентября 2010

EOF не является символом.
EOF не является целым числом.
В файлах никогда не будет EOF (ни char, ни int).

EOF является условием.
Файлы будут либо в таком состоянии, либо (обычно) нет.

Вы должны проверить возвращаемое значение fscanf(), чтобы обнаружить EOF или другие проблемы.

1 голос
/ 08 сентября 2010

Ваше тестирование EOF не совсем правильно

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