将结构变量写入文件,问题

时间:2011-09-14 13:26:27

标签: c file input struct

您好我必须将结构变量的内容写入文件。我有一个工作程序,但输出看起来扭曲,你可以理解当你看输出。代码的简单版本如下,输出如下。

代码:

#include<stdio.h>
#include <stdlib.h>

struct mystruct
{
 char xx[20];
 char yy[20];
 int zz;
};

void filewrite(struct mystruct *myvar)
{
   FILE *f;

   f = fopen("trace.bin","wb");
   if (f == NULL)
   {
     printf("\nUnable to create the file");
     exit(0);
   }

   fwrite(myvar, sizeof(struct mystruct), 1, f);
   fclose(f);

}


void main()
{
    struct mystruct myvar = {"Rambo 1", "Rambo 2", 1234};

    filewrite(&myvar);

}

输出:

(1。整数'1234'在哪里?我需要完好无损。)

(2.为什么会出现一些随机字符?)

trace.bin

Rambo 1Rambo 2Ò

3 个答案:

答案 0 :(得分:8)

你的程序是正确的,输出也是......

您正在编写包含内存中原始数据的二进制文件。 整数zz以4个字节(或2个,取决于系统中int的大小)写入磁盘,最低有效字节优先(我猜的是Intel机器)。

1234(十进制)被写入0xD2,0x04,0x00,0x00到磁盘。 当你以文本形式查看时,0xD2是一个Ò。 0x04和0x是不可打印的字符,因此它们不显示。

答案 1 :(得分:2)

首先,通常将非打包结构类型复制到文件不是一个好习惯,因为编译器可以向结构添加填充以便在内存中对齐它。因此,您将最终得到一个非可移植的实现,或者其他人试图读取您的文件的一些乱码输出,并且由于编译器的填充字节,位/字节没有放置在正确的偏移处。

其次,我不确定你是如何读回你的文件的(看起来你只是将它复制到一个缓冲区并尝试打印),但最后一组字节是int类型的结束...它不会是一个以空字符结尾的字符串,因此它打印的方式看起来不会“正确”...将非空终止的字符串打印为字符串也会导致缓冲区溢出,从而导致分段错误等等。

为了以人类可读的格式回读文件的内容,您需要打开文件并将内容读回正确的数据结构/类型,然后适当地调用printf或一些其他方法可以将二进制数据转换为ASCII数据以进行打印输出。

答案 2 :(得分:1)

我不建议直接将内存转储到文件中,你应该使用一些序列化方法(e.x如果你在struct中有指针,你就注定了)。如果数据将在多个应用程序之间共享,我建议Google Buffers Protocol