【问题标题】:Writing structure variables into a file, problem将结构变量写入文件,问题
【发布时间】:2011-09-14 13:26:26
【问题描述】:

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

代码:

#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Ò

【问题讨论】:

    标签: c file input struct


    【解决方案1】:

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

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

    1234(十进制)作为 0xD2、0x04、0x00、0x00 写入磁盘。 当您以文本形式查看时,0xD2 是 Ò。 0x04 和 0x 是不可打印的字符,因此不会显示。

    【讨论】:

      【解决方案2】:

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

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

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

      【讨论】:

        【解决方案3】:

        我不建议将内存直接转储到文件中,你应该使用一些序列化方法(例如,如果你在结构中有指针,你注定要失败)。如果数据将在多个应用程序之间共享,我推荐Google Buffers Protocol

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2017-04-23
          • 1970-01-01
          • 1970-01-01
          • 2021-10-23
          • 2016-01-26
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多