您好我必须将结构变量的内容写入文件。我有一个工作程序,但输出看起来扭曲,你可以理解当你看输出。代码的简单版本如下,输出如下。
代码:
#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Ò
答案 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。