c - 如何检查两个文件的内容是否相同?
问题描述
我需要检查两个文件的内容是否相同,我的意思是每个文件中的字符串是否彼此相等。我用c语言编写了一个程序,如果文件相同,则返回2,否则返回1。我的问题是无论内容是什么,该函数都保持返回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;
}
解决方案
#include <stdio.h>
int compareFilles(FILE *fp1, FILE *fp2){
此函数应返回 a 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;
}
推荐阅读
- r - 故障排除警告消息,条件长度 > 1,仅使用第一个元素
- php - 1970 年 1 月 1 日的时间戳变为 -3600
- python - NGINX 和 Docker 中的 Gunicorn 中的权限错误:connect() 到 unix:/tmp/gunicorn.sock 在连接到上游时失败(13:权限被拒绝)
- c# - 在 JSON 响应中访问数组的问题
- c++ - C++中二维数组的大小
- javascript - 无法从循环内的文本框中传递数据
- terraform - 如何对外部程序隐藏 AWS 凭证?
- css - 图像最大宽度属性导致意外行为
- python - 为什么 datetime 在 Windows 上无法转换为时间戳 < 86400?
- python-3.x - 可以使用 subprocess.Popen 函数将字典作为参数发送吗?