数据的 fread 不等于相同数据的 fwrite

fread of data isn't equal to fwrite of that same data

提问人:rmoss3475 提问时间:3/29/2021 最后编辑:rmoss3475 更新时间:3/29/2021 访问量:49

问:

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 char fwrite fread

评论

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

答:

0赞 Joshua 3/29/2021 #1

我在这里看到了两个错误。

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

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

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

评论

0赞 rmoss3475 3/29/2021
问题是密文的 wb 和 rb。strcmp 错误只是我试图简化代码并搞砸了它。我正在使用 Ubuntu,但无论如何总是很乐意责怪 Windows!