使用C在文件中排列数字

时间:2017-12-06 07:37:03

标签: c file

我需要记下两个文件中列出的数字" 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中的数字,即使它还没有达到它的文件末尾。我已经仔细查看了它,我似乎无法找到它停止的原因,所以请帮助我们!

1 个答案:

答案 0 :(得分:1)

当前代码存在一些问题

  1. 应在主循环
  2. 之前执行2个数字的初始化
  3. feof()此处使用
  4. <严格的<= insteaf测试(可以锁定你的算法)
  5. 如果另一个文件变空,请继续阅读文件
  6. 关于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.