[英]C program to merge files not finding EOF, stuck in infinite loop!
我在嘗試運行我正在開發的程序時遇到一些問題...要求說我不允許使用排序功能...我自己做了一些事情...等等。
程序幾乎可以編譯但在執行后會掛起...我猜它陷入了無限循環...但是我似乎找不到它... :(
該程序讀取已最小排序到最大排序的數據文件,並將它們合並(排序)為第三個.txt文件...
Data1.txt和Data2.txt這兩個文件包含:
數據1.txt
2
2
2
2
Data2.txt
1
3
5
7
9
組合
#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;
}
您不想比較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
)。
您對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);}
}
EOF不是字符。
EOF不是整數。
任何文件都不會包含EOF ( char
或int
)。
EOF是一個條件。
文件要么處於那種狀態,要么(通常)沒有。
您應該檢查fscanf()
的返回值以檢測EOF或其他問題。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.