合并 - 比较 - 输出(C)

时间:2012-04-23 22:42:22

标签: c merge compare fgets fputs

我正在创建一个程序,它接受两个.txt(data1.txt,data2.txt)文件,这些文件包含按升序存储的整数,并按升序将它们合并到output.txt(data3.txt)中。我正在使用fgets函数从.txt文件中读取每个int,并使用if函数(根本不工作)比较两个input.txt文件中的每个文件的fgets。所以我的问题是比较两个fgets函数以按升序排序整数的正确方法是什么?

data1.txt包含: 五 15 25 35 45

data2.txt包含: 10 20 三十 40 50

以下是代码:

#include <stdio.h>
#include <stdlib.h>
#define LINE_LENGTH 80


int main()
{
FILE *in1, *in2, *out;
char buffer1[LINE_LENGTH+1], buffer2[LINE_LENGTH+1];
int ch1, ch2;


in1 = fopen("data1.txt", "r");
in2 = fopen("data2.txt", "r");
out = fopen("data3.txt", "w");

if(in1 == NULL || in2 == NULL)
{
    fprintf(stderr, "Cannot open input file - exiting!\n");
    exit(1);
}
if(out == NULL)
{
    fprintf(stderr, "Cannot open output file - exiting!\n");
    exit(1);
}

while( ! feof(in1) ) #Checking for end of file
{
    fscanf(in1, "%d", &ch1);
    fscanf(in1, "%d", &ch2);
    if (ch1 <=  ch2) fputs(ch1, out);
    else fputs(ch2, out);
}


while( ! feof(in2) ) #Checking for end of file
{
    fscanf(in1, "%d", &ch1);
    fscanf(in2, "%d", &ch2);
    if (ch2 <=  ch1) fputs(ch2, out);
    else fputs(ch1, out);
}

fclose(in1);
fclose(in2);
fclose(out);

return 0;

}

希望我能够覆盖所有内容,如果您需要更多信息,请告诉我

谢谢!

-------------- EDIT ------------

我正在尝试使用fscanf实现while循环,但是gcc会抛出错误:“对于包含fputs函数的每一行,”传递'fputs'的参数1使得整数中的指针没有强制转换“。我应该不使用带有fscanf的fputs,还是ch1 / ch2应该是不同的格式?

2 个答案:

答案 0 :(得分:1)

我认为你真的不知道fgets会做什么。它读取一行(如果缓冲区足够大)并将其存储到缓冲区中。然后它返回一个指向同一缓冲区的指针,这对比较没有意义。 您需要读取每个整数并进行比较,您可能希望使用fscanf(in1, "%d", &n);将整数读取为n,这将忽略任何空格,如果您知道您的文件只包含数字,那么它将会很好用。此外,您正在in1以及in2内的文件末尾阅读。

再考虑一下,因为看起来你并不真正理解发生了什么。

答案 1 :(得分:1)

fgets用于从流中获取字符串。你最好用fscanf来读取整数。我的建议是先将这些文件读入两个独立的数组,然后对它们进行排序。如果文件变大,保持文件打开可能会导致错误。这是一个将文件读入整数数组的示例代码。

int* readFile(int *array, char *file) {
    FILE *fp = fopen(file, "r");
    int x;
    int i = 0;

    while (fscanf(fp, "%d", &x) == 1) {
        *(array+i) = x;
        i++;
    }
    fclose(fp);

    return array;
}