【发布时间】:2022-01-13 01:29:59
【问题描述】:
这段代码基本上应该从两个文件中读取一个数字,确定哪个较小,将较小的一个写入输出文件,获取一个新数字,冲洗并重复。它在大多数情况下都做得很好,但是当它到达终点时它不会停止。我尝试使用 EOF 告诉它在到达文件末尾时停止,但它只是无限循环并将最后一个数字添加到输出文件中,所以它看起来不像它应该的“123456789”,它最终看起来就像“123456788999999999999”一样,8 打印两次,而 9 只是无限重复。我使用EOF错了吗?或者我是否需要完全做其他事情,请记住我对 c 很陌生并且不知道很多事情。
#include <stdio.h>
#include <stdlib.h>
void mergeFuncs(FILE* num1txt, FILE* num2txt, FILE* outtxt);
int main(int argc, char* argv[]) {
FILE* num1txt;
num1txt = fopen("numbers1.txt", "r");
if (num1txt == NULL) {
printf("Error opening numbers1.txt!");
exit(1);
}
FILE* num2txt;
num2txt = fopen("numbers2.txt", "r");
if (num2txt == NULL) {
printf("Error opening numbers2.txt!");
exit(1);
}
FILE* outtxt;
outtxt = fopen("output.txt", "w");
if (outtxt == NULL) {
printf("Error opening output.txt!");
exit(1);
}
mergeFuncs(num1txt, num2txt, outtxt);
return 0;
}
void mergeFuncs(FILE* num1txt, FILE* num2txt, FILE* outtxt) {
int num1, num2, loop = 1, endOfFile1, endOfFile2;
endOfFile1 = fscanf(num1txt, "%d", &num1);
printf("in getNum1 - %d\n", num1);
endOfFile2 = fscanf(num2txt, "%d", &num2);
printf("in getNum2 - %d\n", num2);
while (loop) {
printf("\nStart of a new loop! num1 is [%d], and num2 is [%d]\n", num1, num2);
if (endOfFile1 == EOF && endOfFile2 == EOF) {
if (num1 < num2) {
fprintf(outtxt, "%d", num1);
printf("num1 is smaller\n");
fprintf(outtxt, "%d", num2);
printf("done :) //uwu//");
fclose(num1txt);
fclose(num2txt);
fclose(outtxt);
}
else if (num2 < num1) {
fprintf(outtxt, "%d", num2);
printf("num2 is smaller\n");
fprintf(outtxt, "%d", num1);
printf("done :) //uwu//");
fclose(num1txt);
fclose(num2txt);
fclose(outtxt);
}
loop = 0;
}
else if (endOfFile1 == EOF) {
fprintf(outtxt, "%d", num1);
while (endOfFile2 !=EOF) {
fprintf(outtxt, "%d", num2);
}
fprintf(outtxt, "%d", num2);
loop = 0;
fclose(num1txt);
fclose(num2txt);
fclose(outtxt);
}
else if (endOfFile2 == EOF) {
fprintf(outtxt, "%d", num2);
while (endOfFile1 != EOF) {
printf(outtxt, "%d", num1);
}
printf(outtxt, "%d", num1);
loop = 0;
fclose(num1txt);
fclose(num2txt);
fclose(outtxt);
}
else if (num1 < num2) {
fprintf(outtxt, "%d", num1);
printf("num1 is smaller\n");
endOfFile1 = fscanf(num1txt, "%d", &num1);
printf("in getNum1 - %d\n", num1);
}
else if (num2 < num1) {
fprintf(outtxt, "%d", num2);
printf("num2 is smaller\n");
endOfFile2 = fscanf(num2txt, "%d", &num2);
printf("in getNum2 - %d\n", num2);
}
}
return;
}
【问题讨论】:
-
while (endOfFile1 != EOF) { printf(outtxt, "%d", num1); }之类的内容应该会引起您的注意。endOfFile1在那个循环中永远不会更新,那么循环怎么会结束呢?printf的参数也是错误的,应该是fprintf。编译器真的让你放弃了吗? -
也许检查documentation for fscanf,以及它返回的内容,可能会有所了解。