为什么fwrite&fread打印垃圾?

当运行以下代码时,为什么在HALLO字符串旁边打印了额外的垃圾?

#include  #include  int main(void) { FILE *binfile; binfile = fopen("binary.bin", "wb+"); char arr[5] = "HALLO"; int integer = 1; double doub = 1.2345; fwrite(arr, sizeof(arr), 1, binfile); fwrite(&integer, sizeof(int), 1, binfile); fwrite(&doub, sizeof(double), 1, binfile); fclose(binfile); binfile = fopen("binary.bin", "r"); char arr2[5]; int integer2; double doub2; fread(arr2, sizeof(arr2), 1, binfile); fread(&integer2, sizeof(int), 1, binfile); fread(&doub2, sizeof(double), 1, binfile); printf("%s\n", arr2); printf("%d\n", integer2); printf("%lf\n", doub2); fclose(binfile); return EXIT_SUCCESS; } 

因为你没有允许字符串上的null终止符。

好的,更多细节。 你还没弄清楚你想要做什么,所以我们假设你要写5个字节。 问题是,当你回读你的5个字符时,你把它们读回一个字符数组(很好)然后尝试打印那个没有空终止符的数组 – 不好。

因此要么将它们读回新数组并进行设置

 newarray[5]=0; 

或者知道你有5个字符可以安全地打印出来

 printf("%5.5s",array); 

(无论如何都是这样的)

printf(“%s \ n”,arr2)arr2解释为指向字符串的指针,而不是char数组。 由于您的char数组不以零终止符结束,因此printf会愉快地打印存储在char数组后面的内存位置中的任何内容。

此代码段应该有效:

 char arr2[5+1]; fread(arr2, sizeof(arr2) - 1, 1, binfile); arr2[sizeof(arr2) - 1] = '\0'; printf("%s\n", arr2);