【问题标题】:fread of data isn't equal to fwrite of that same data数据的 fread 不等于相同数据的 fwrite
【发布时间】:2021-03-28 17:22:46
【问题描述】:
int main(){
    char * saveMe = "123 ABC";
    int len = strlen(saveMe);
    int charSize = sizeof(char);
    char * loadMe = malloc(len+1);

    FILE * fp = fopen("test.txt", "w");
    fwrite(saveMe, charSize, len, fp);
    fclose(fp);

    fp = fopen("test.txt", "r");
    fread(loadMe, charSize, len, fp);
    fclose(fp);

    printf((strcmp(saveMe, loadMe)) ? "Strings are the Same.\n" : "Strings are different.\n");

    free(loadMe);
    return 0;
}

如果我保存字符串然后重新加载它,“字符串不同”。

我确信这很简单,但我已经尝试了我能想到的一切。

【问题讨论】:

  • 我们不使用 C 中的 == 运算符比较字符串,而是使用 strcmp。此外,您没有空间容纳尾随的 NUL,您需要 malloc(len + 1);fwriite(..., ..., len + 1, ...
  • 谢谢大卫。即使有这些变化,也没有骰子。
  • 好吧,现在您需要!strcmp(strcmp(...) == 0),请记住,如果两个字符串相等,strcmp 将返回 0。
  • 就是这样。谢谢你。现在回到弄清楚为什么当我加密/解密东西时它不起作用。
  • loadMe 不是 NULL 终止的。尝试使用 calloc()

标签: arrays c char fwrite fread


【解决方案1】:

我发现这里有两个错误。

  1. fopen("test.txt", "w"); 应该是 ..., "wb"..., "rb" 对于将与 fread()fwrite() 一起使用的所有对 fopen 的调用。我怀疑你的平台是 Windows,因为这个错误,它正在破坏你的密文。

  2. (strcmp(saveMe, loadMe)) ? same : differentstrcmp 返回 0 表示相同。

由于减少,无法判断您是否有这种情况;但是由于嵌入空值的趋势,您不能在密文上使用strcmp();您必须自己跟踪另一个变量。

【讨论】:

  • 问题是密文的 wb 和 rb。 strcmp 错误只是我试图简化代码并将其弄乱。我正在使用 Ubuntu,但总是很乐意责怪 Windows!
猜你喜欢
  • 1970-01-01
  • 2012-09-28
  • 2012-05-06
  • 1970-01-01
  • 2016-12-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-12-14
相关资源
最近更新 更多