【发布时间】:2015-07-19 21:18:42
【问题描述】:
我正在编写一个程序,它基本上在一个目录及其所有子目录中搜索重复文件。我已经根据您的建议完善了问题和代码(需要返回默认值的函数已被修复)所以这里......
下面是比较函数的代码:
int compare()
{
int a, b;
unsigned char byte1, byte2;
while(1)
{
a = fread(&byte1, 1, 1, file1);
b = fread(&byte2, 1, 1, file2);
if(a == 0 && b == 0) break;
if(a != b) return 1;
if(byte2 != byte1) return 1;
}
return 0;
}
void startCompare()
{
char path1[1000], path2[1000];
FILE *reference = fopen("list.comp", "r");
FILE *other = fopen("list2.comp", "r");
int i, flag, j;
i = 0;
while(fgets(path1, 1000, reference))
{
flag = 0;
strtok(path1, "\n");
openFile1(path1);
for(j = 0; j <= i; ++j)
{
fgets(path2, 1000, other);
}
while(fgets(path2, 1000, other))
{
strtok(path2, "\n");
openFile2(path2);
if(!compare())
{
printf("Checking: %s vs. %s --> DUPLICATE\n", path1, path2);
flag = 1;
break;
}
else
{
printf("Checking: %s vs. %s --> DIFFERENT\n", path1, path2);
}
}
if(flag == 1)
{
printf("Will be deleted.\n");
}
}
}
(先调用startCompare()函数)
现在,目录本身有这些文件:
- bloblo
- bloblo/frofo
- bloblo/frofo/新建文件夹
- bloblo/frofo/新建文件夹 (2)
- bloblo/frofo/新建文件夹 (2)/新建文件夹 (3)
- bloblo/frofo/新建文件夹 (2)/新建文件夹 (3)/新建文本 Document.txt
- bloblo/frofo/新建文件夹 (2)/新建文件夹 (3)/Untitled4
- 0.comp
- 1.comp
- 2.comp
- 3.comp
- 4.comp
- 5.comp
- 11.comp
- 100.comp
- duplicate_delete.dev
- duplicate_delete.exe
- duplicate_delete.layout
- list.comp
- list2.comp
- main.c
- main.o
- Makefile.win
- Untitled5.c
- Untitled5.exe
输出是:
Checking: 0.comp vs. 1.comp --> DIFFERENT
Checking: 0.comp vs. 100.comp --> DIFFERENT
Checking: 0.comp vs. 11.comp --> DIFFERENT
Checking: 0.comp vs. 2.comp --> DIFFERENT
Checking: 0.comp vs. 3.comp --> DIFFERENT
Checking: 0.comp vs. 4.comp --> DIFFERENT
Checking: 0.comp vs. 5.comp --> DIFFERENT
Checking: 0.comp vs. duplicate_delete.dev --> DIFFERENT
Checking: 0.comp vs. duplicate_delete.exe --> DIFFERENT
Checking: 0.comp vs. duplicate_delete.layout --> DIFFERENT
Checking: 0.comp vs. list.comp --> DIFFERENT
Checking: 0.comp vs. list2.comp --> DIFFERENT
Checking: 0.comp vs. main.c --> DIFFERENT
Checking: 0.comp vs. main.o --> DIFFERENT
Checking: 0.comp vs. Makefile.win --> DIFFERENT
Checking: 0.comp vs. Untitled5.c --> DIFFERENT
Checking: 0.comp vs. Untitled5.exe --> DIFFERENT
返回码为 0。
虽然它应该打印的是每个文件都被相互检查并发现文件 100.comp 和 11.comp 是彼此的副本并且其他文件是唯一的。所以基本上,为什么它停在那里?为什么不继续检查?有什么办法可以解决吗?
【问题讨论】:
-
请说明你有哪些文件(你的列表格式搞砸了),预期的输出是什么,你得到什么输出。请尝试删除不需要证明问题的文件(阅读this 可能也有帮助)。另外,请询问有关一个代码版本的问题 - 有或没有
fclose- 这将减少混乱。 -
compare使用feof错误,最后缺少返回语句。 -
首先确保所有返回值的函数都返回值。
main被声明为返回int,但不返回任何内容。openFile1在您无法打开文件时返回 0,但在可以时从堆栈中返回垃圾。openFile2也是如此。当所有 ifs 语句都不为真时,会返回什么compare?垃圾…… -
请注意
sizeof(unsigned char)的定义是1。 -
您最近的编辑混淆了整个帖子。推荐 1) 将帖子恢复到“根据您的建议优化问题和代码”之前 2) 接受 @Weather Vane 3) 发布一个涉及此问题的 新 问题 4) 确保您的新问题帖子是完全可编译的,以最少的输入行显示剩余的问题。