我正在创建一个程序,它接受两个.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应该是不同的格式?
答案 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;
}