我需要检查两个文件的内容是否相同,即每个文件中的字符串是否相等。我用C语言编写了一个程序,该程序的功能是:如果文件相同,则返回2,否则返回1。我的问题是,无论内容是什么,该函数都会保持return 1。
#include <stdio.h>
int compareFilles(FILE *fp1, FILE *fp2){
int word1 = getc(fp1);
int word2 = getc(fp2);
//A loop until the end of the files(EOF)
while (word1 =! EOF && word2 != EOF && word1 == word2){
word1 = getc(fp1);
word2 = getc(fp2);
}
if (word1 != word2){
return 1;
}else{
return 2;
}
}
int main(int argc, char* argv[]){
FILE *fp1 = fopen(argv[0], "r");
FILE *fp2 = fopen(argv[1], "r");
printf("%d", compareFilles(fp1, fp2));
//closing the files
fclose(fp1);
fclose(fp2);
return 0;
}
答案 0 :(得分:1)
通常,argv[0]
包含用于启动程序的命令,通常是可执行文件的名称或其一部分。因此,您的程序会将自己的可执行文件与第一个参数(argv[1]
)命名的文件进行比较,它们是不同的。
答案 1 :(得分:1)
#include <stdio.h>
int compareFilles(FILE *fp1, FILE *fp2){
此函数应返回bool
,因为这是用于表达true/false
值的自然数据类型。
int word1 = getc(fp1);
int word2 = getc(fp2);
变量名称错误。 getc
函数不读取单词,仅从文件中读取单个字节。
//A loop until the end of the files(EOF)
while (word1 =! EOF && word2 != EOF && word1 == word2){
正如其中一条评论中所述,=!
的意思是“分配否定”,而不是您的意思是“不平等”。为避免将来发生此类错误,请始终让自动代码格式化程序在将代码保存到磁盘之前对其进行格式化。然后该代码将显示为word1 = !EOF
,应该引起足够的注意。这样做还可以保护您免受著名的goto fail错误的影响,这意味着您将拥有比Apple更好的编程标准。听起来很多,不是吗?
此外,请始终启用所有编译器警告。编译器会警告您有关“在某种情况下分配的情况,这通常是不希望的”,这就是这里的情况。
word1 = getc(fp1);
word2 = getc(fp2);
}
if (word1 != word2){
return 1;
}else{
return 2;
}
}
如果函数返回bool
,则最后一个if
语句应简单地替换为return word1 == word2
。
int main(int argc, char* argv[]){
FILE *fp1 = fopen(argv[0], "r");
FILE *fp2 = fopen(argv[1], "r");
此处缺少错误检查。如果fp1
或fp2
中的任何一个为NULL,则程序必须处理此错误。
printf("%d", compareFilles(fp1, fp2));
//closing the files
fclose(fp1);
fclose(fp2);
return 0;
}