我是C编程的新手,我正在尝试从2个TXT文件比较1024个字节的块(我现在正在使用10个字节(,并检查其中有多少个块相同。
我正在读取fread的块并将其与strcmp进行比较,但是fread读取了第一个文件的双倍,即使我以相同的方式读取了两者。这是我的比较函数:
void compareFiles(FILE *fp1, FILE *fp2)
{
char fp1_content[10]; //should be 1024
char fp2_content[10]; //should be 1024
fread(fp1_content, 10, 1, fp1); //should be 1024
fread(fp2_content, 10, 1, fp2); //should be 1024
printf("content of 81.txt %s n", fp1_content);
printf("content of 82.txt %s n", fp2_content);
char ch1 = getc(fp1);
char ch2 = getc(fp2);
int eqBlocks = 0;
while (ch1 != EOF && ch2 != EOF)
{
if (strcmp(fp1_content, fp2_content) == 0) {
eqBlocks++;
}
ch1 = getc(fp1);
ch2 = getc(fp2);
fread(fp1_content, 10, 1, fp1);
fread(fp2_content, 10, 1, fp2);
}
printf("Nb of identical blocks: %dn", eqBlocks);
}
这是一个问题:我有两个文件中的lorem ipsum文本,同一文本。但是前两个printf正在输出:
content of 81.txt Lorem ipsuLorem ipsu
content of 82.txt Lorem ipsu
为什么第一个加倍?我如何解决此问题?
op的代码需要一些修复。
返回值
诸如fread()
返回有用信息之类的功能。使用它们。这种情况告诉它是阅读了多少。@Weather Vane
"%s"期望 string 指针
printf("content of 81.txt %s n", fp1_content);
期望 fp1_content
是 string 。在C中,A string 始终具有 null字符,否则,它不是字符串。要打印可能没有' '
的文本,请使用"%.*s"
,该文本接受参数以限制打印长度。具有非弦乐的"%s"
是不确定的行为。意外的事情可能会发生。@tom karzes
将非弦与memcmp()
不必要的代码
char ch1 = getc(fp1);
不需要检测结束,使用fread()
返回值。@jean-françoisfabre旁边:使用int ch1
将257个不同的返回值与fgets()
区分开
避免裸魔法
而不是在这里和那里使用10
的垃圾代码,请使用命名常数。
思考大
文件可能大于INT_MAX
块。建议long long eqBlocks
。
#include <limits.h>
#define COMPAREFILES_N 10
#if COMPAREFILES_N > INT_MAX
#error Use smaller block
#endif
void compareFiles(FILE *fp1, FILE *fp2) {
char fp1_content[COMPAREFILES_N];
char fp2_content[COMPAREFILES_N];
long long eqBlocks = 0;
for (;;) {
size_t len1 = fread(fp1_content, COMPAREFILES_N, 1, fp1);
size_t len2 = fread(fp2_content, COMPAREFILES_N, 1, fp2);
if (len1 < 1 || len2 < 1) {
break; // failed to read a block in each file
}
if (memcmp(fp1_content, fp2_content, COMPAREFILES_N) == 0) {
eqBlocks++;
printf("Common content `%.*s`n", COMPAREFILES_N, fp1_content);
}
}
printf("Nb of identical blocks: %lldn", eqBlocks);
}