来自两个不同文件的 fscanf
fscanf from two different files
在学校的一次作业中,我遇到了一个我无法理解的现象。
我的任务是读取两个文件并检查它们是否完全相同。
我制作了两个包含完全相同行的文本文件:
"Hello world"
我决定一个字符一个字符地检查文本。
一开始我写了下面的代码:
编辑:由于许多请求,我重新编写了要在此处显示的整个代码:
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
int main() {
char c1, c2;
int ans = 1;
FILE *f1 = fopen("text1.txt","rt");
FILE *f2 = fopen("text2.txt","rt");
for (fscanf(f1, "%c", &c1), fscanf(f2, "%c", &c2);
!feof(f1) && !feof(f2) && ans;
fscanf(f1, "%c", &c1), fscanf(f2, "%c", &c2))
{ // Check Data:
if (c1 != c2) ans = 0;
printf("%c %c\n",c1,c2); // Print side by side check
} // Check Tail:
if (!feof(f1)) ans=0;
if (!feof(f2)) ans=0;
if (ans) printf("File 1 == File 2");
else printf("File 1 != File 2");
return 0;
}
但出于某种原因,代码将 'H' 输入到 c1,将 'e' 输入到 c2。
为什么会这样?
编辑:我似乎无法重现这个问题(这在我参加大学考试时发生在我身上,因此我无法再访问原始代码。大学使用的是过时的 Microsoft Visual Studio 2012当我使用 2015express version/netbeans)
编码时
查看您的代码,我看不到对您记录的行为的解释。您应该 post 一个最小的完整可验证示例,用于查看函数的其余部分。
您的方法不是很有效,并且无法检测到文件不同的某些情况:您测试文件结尾的方式是近似的。
这是使用 getc
的替代方法:
int c1, c2;
int identical = 1;
for (;;) {
c1 = getc(f1);
c2 = getc(f2);
if (c1 != c2) {
identical = 0;
break;
}
if (c1 == EOF)
break;
}
编辑:在你 post 编辑了更多代码后,你得出结论:我似乎无法重现这个问题(这发生在我参加大学考试时,因此我不能再访问原码
我猜你在 for
循环的初始部分从 f1
扫描了 c1
和 c2
,这是一个经典的剪切和粘贴错误。
在学校的一次作业中,我遇到了一个我无法理解的现象。
我的任务是读取两个文件并检查它们是否完全相同。 我制作了两个包含完全相同行的文本文件:
"Hello world"
我决定一个字符一个字符地检查文本。 一开始我写了下面的代码:
编辑:由于许多请求,我重新编写了要在此处显示的整个代码:
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
int main() {
char c1, c2;
int ans = 1;
FILE *f1 = fopen("text1.txt","rt");
FILE *f2 = fopen("text2.txt","rt");
for (fscanf(f1, "%c", &c1), fscanf(f2, "%c", &c2);
!feof(f1) && !feof(f2) && ans;
fscanf(f1, "%c", &c1), fscanf(f2, "%c", &c2))
{ // Check Data:
if (c1 != c2) ans = 0;
printf("%c %c\n",c1,c2); // Print side by side check
} // Check Tail:
if (!feof(f1)) ans=0;
if (!feof(f2)) ans=0;
if (ans) printf("File 1 == File 2");
else printf("File 1 != File 2");
return 0;
}
但出于某种原因,代码将 'H' 输入到 c1,将 'e' 输入到 c2。 为什么会这样?
编辑:我似乎无法重现这个问题(这在我参加大学考试时发生在我身上,因此我无法再访问原始代码。大学使用的是过时的 Microsoft Visual Studio 2012当我使用 2015express version/netbeans)
编码时查看您的代码,我看不到对您记录的行为的解释。您应该 post 一个最小的完整可验证示例,用于查看函数的其余部分。
您的方法不是很有效,并且无法检测到文件不同的某些情况:您测试文件结尾的方式是近似的。
这是使用 getc
的替代方法:
int c1, c2;
int identical = 1;
for (;;) {
c1 = getc(f1);
c2 = getc(f2);
if (c1 != c2) {
identical = 0;
break;
}
if (c1 == EOF)
break;
}
编辑:在你 post 编辑了更多代码后,你得出结论:我似乎无法重现这个问题(这发生在我参加大学考试时,因此我不能再访问原码
我猜你在 for
循环的初始部分从 f1
扫描了 c1
和 c2
,这是一个经典的剪切和粘贴错误。