c-壁画从文件中读取双重



我是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);
}

相关内容

  • 没有找到相关文章

最新更新