【问题标题】:Output not as expected in fwrite在 fwrite 中输出不符合预期
【发布时间】:2013-09-26 14:51:56
【问题描述】:

我正在学习 c 的 fread 和 fwrite 并制作了一个基本代码来使用 fwrite 在文件中编写结构。输出在

上
       #include<stdio.h>
       int main()
       {
       FILE *f;
       int i,q=0;
       typedef struct {
                       int a;
                       char ab[10];
       }b;
       b var[2];
       f=fopen("new.c","w");
       printf("Enter values in structure\n");
       for(i=0 ; i<2 ; i++)
       {
           scanf("%d",&var[i].a);
           scanf("%s",var[i].ab);
       }
       fwrite(var,sizeof(var),1,f);

       fclose(f);
       return 0;
       }

输出不流畅,因为它在文件中包含奇怪的字符。我也以二进制模式打开文件,但徒劳无功。这是某种缓冲问题吗?

【问题讨论】:

  • fwrite 的参数可能需要调整。第三个参数有“1”,告诉它你只想输出 1 个元素。对于第二个参数,您需要元素大小,它应该是字节。 (int和char是两种不同大小的粗略,所以共同点是字节大小的输出)。试试fwrite(var, 1, sizeof(var), f);
  • @ryykker,OP 的代码很好。
  • @CarlNorum - 同意,我走了,解决了,使用 fprintf (如你所建议的那样),它工作正常。谢谢。请问您使用什么工具来获取文件偏移、数据和关系列?
  • @ryyker - 我手工制作的。

标签: c file fwrite


【解决方案1】:

文件中的“奇怪”字符可能是您正在写出的二进制整数的字节。 fwrite 将var 的位直接写入文件,而不是将其转换为人类可读的格式。如果需要,请改用fprintf。

这是直接来自您上面的代码的示例:

$ ./example 
Enter values in structure
5 hello
8 world
$ hexdump -vC new.c 
00000000  05 00 00 00 68 65 6c 6c  6f 00 00 00 00 00 00 00  |....hello.......|
00000010  08 00 00 00 77 6f 72 6c  64 00 00 00 00 00 00 00  |....world.......|
00000020

请注意,偏移量0x00 和0x10 的前四个字节是输入的数字(因为我的机器是小端序和32 位),然后是输入的字符串,加上一些结构填充。全部分解:

 File Offset     Data (ASCII)     Relationship to source
     0             05               var[0].a  7:0
     1             00               var[0].a 15:8
     2             00               var[0].a 23:16
     3             00               var[0].a 31:24
     4             68 (h)           var[0].ab[0]
     5             65 (e)           var[0].ab[1]             
     6             6c (l)           var[0].ab[2]
     7             6c (l)           var[0].ab[3]
     8             6f (o)           var[0].ab[4]
     9             00 (NUL)         var[0].ab[5]
    10             00 (NUL)         var[0].ab[6]
    11             00 (NUL)         var[0].ab[7]
    12             00 (NUL)         var[0].ab[8]
    13             00 (NUL)         var[0].ab[9]
    14             00               structure padding
    15             00               structure padding
    16             08               var[1].a  7:0
    17             00               var[1].a 15:8
    18             00               var[1].a 23:16
    19             00               var[1].a 31:24
    20             77 (w)           var[1].ab[0]
    21             6f (o)           var[1].ab[1]             
    22             72 (r)           var[1].ab[2]
    23             6c (l)           var[1].ab[3]
    24             64 (d)           var[1].ab[4]
    25             00 (NUL)         var[1].ab[5]
    26             00 (NUL)         var[1].ab[6]
    27             00 (NUL)         var[1].ab[7]
    28             00 (NUL)         var[1].ab[8]
    29             00 (NUL)         var[1].ab[9]
    30             00               structure padding
    31             00               structure padding

【讨论】:

  • 所以整数不可读但字符串可读,为什么?这只是整数的情况,那么为什么 fwrite 用于打印结构?
  • 因为字符串已经是人类可读的格式。整数不是 - 它只是一个数字。你还能期待什么?你甚至在使用scanf...我认为你需要回到计算机如何存储数据的基础知识。
  • "因为字符串已经是人类可读的格式。整数不是 - 它只是一个数字。你还能期待什么?你甚至使用 scanf" ...所以一个数字在与字符串(或字符)混合到文件的块(即结构)内打印时,将不会以可读的形式出现,因为??..请解释一下我是基础知识。
  • 这是因为字符串以空字符结尾并以可读格式理解,但整数不以空字符结尾,而且还有结构填充,在与整数位混合后也使其不可读?
  • 好吧,空终止符当然存在,但这与整数没有任何关系。你想问什么?
猜你喜欢
  • 2022-01-16
  • 2017-02-11
  • 1970-01-01
  • 1970-01-01
  • 2014-09-22
  • 1970-01-01
  • 2021-10-04
  • 2012-08-24
  • 1970-01-01
相关资源
最近更新 更多