我需要记下两个文件中列出的数字" numbers1.txt"和" numbers2.txt" (数字以升序列出)并将它们移动到名为" output.txt"的文件中。它们按升序排列。
这是我到目前为止所做的:
void appendToOutput(FILE *numFile1, FILE *numFile2, FILE *outputFile)
{
int num1 = 0;
int num2 = 0;
do {
fscanf(numFile1, "%d", &num1);
fscanf(numFile2, "%d", &num2);
while ((num1 < num2) && !feof(numFile1))
{
fprintf(outputFile, "%d\n", num1);
fscanf(numFile1, "%d", &num1);
}
while ((num2 < num1) && !feof(numFile2))
{
fprintf(outputFile, "%d\n", num2);
fscanf(numFile2, "%d", &num2);
}
if (num1 == num2)
{
fprintf(outputFile, "%d\n%d\n", num1, num2);
}
} while (!feof(numFile1) || !feof(numFile2));
return;
}
我的文件如下所示:
numbers1.txt
1
2
3
4
5
6
7
8
9
10
11
12
numbers2.txt:
2
4
6
8
10
12
14
16
18
20
22
24
我遇到的问题是输出文件最终看起来像这样: output.txt的
1
2
2
3
4
4
5
6
6
7
8
8
9
10
10
11
12
12
所以我的问题是该程序没有继续读取/写入numbers2.txt中的数字,即使它还没有达到它的文件末尾。我已经仔细查看了它,我似乎无法找到它停止的原因,所以请帮助我们!
答案 0 :(得分:1)
当前代码存在一些问题
feof()
此处使用<
严格的<=
insteaf测试(可以锁定你的算法)关于2.,fscanf
如果可以读取数字,则会返回一个数字>0
,因此您可以对此进行测试,而不是检查feof
(表示EOF(停止条件))发生在之前,这可能会引发一次不必要的迭代)。
建议的固定代码:
int read1 = fscanf(numFile1, "%d", &num1);
int read2 = fscanf(numFile2, "%d", &num2);
while (read1 > 0 || read2 > 0) {
while (read1 > 0 && (read2<=0 || num1 <= num2))
{
fprintf(outputFile, "%d\n", num1);
read1 = fscanf(numFile1, "%d", &num1);
}
while (read2 > 0 && (read1<=0 || num2 <= num1))
{
fprintf(outputFile, "%d\n", num2);
read2 = fscanf(numFile2, "%d", &num2);
}
}
进一步解释
readX<=0 || numY <= numX
地址4.
readX = fscanf(...)
地址2.