C 如何在文件中写入完整结构?
在我的程序中,我接收来自键盘的输入。我将该输入放入一个C 如何在文件中写入完整结构?,c,C,在我的程序中,我接收来自键盘的输入。我将该输入放入一个struct,其中包含两个char字段和一个int字段。如何仅使用函数写入整个struct 我不想单独写入结构的每个成员。C没有“指令” 您应该能够使用单个函数调用,例如: fwrite(&mystructure, sizeof mystructure, 1, myfile); 但这并非没有缺点: 这使得文件格式取决于您当前的CPU和编译器,这通常是一个坏主意;这将使维护互操作性变得非常困难 写作可能部分成功;在这种情况下,你需要把
struct
,其中包含两个char
字段和一个int
字段。如何仅使用函数写入整个struct
我不想单独写入结构的每个成员。C没有“指令”
您应该能够使用单个函数调用,例如:
fwrite(&mystructure, sizeof mystructure, 1, myfile);
但这并非没有缺点:
这使得文件格式取决于您当前的CPU和编译器,这通常是一个坏主意;这将使维护互操作性变得非常困难
写作可能部分成功;在这种情况下,你需要把它包装成一个循环
这取决于如何定义结构
,是否希望输出具有可读性,以及是否要在不同的体系结构上读取输出文件
其他人给出的fwrite
解决方案将把结构的二进制表示形式写入输出文件。例如,给定以下代码:
#include <stdio.h>
int main(void)
{
struct foo {
int x;
char name1[10];
char name2[10];
} items[] = {{1,"one","ONE"}, {2,"two","TWO"}};
FILE *output = fopen("binio.dat", "w");
fwrite( items, sizeof items, 1, output );
fclose( output );
return 0;
}
整数值显示为垃圾(上面没有复制),因为它们被存储为字节序列01、00、00、00和02、00、00、00(x86是小尾端),这是不可打印的字符。还请注意,name1
的所有10个字符和name2
的所有20个字符都会写入文件,这可能是您想要的,也可能不是您想要的
如果结构包含指针,情况会变得更加复杂,因为存储到文件中的是指针值,而不是指向的对象:
#include <stdio.h>
int main(void)
{
struct foo {
int x;
char *name1;
char *name2;
} items[] = {{1,"one","ONE"}, {2,"two","TWO"}};
FILE *output = fopen("binio.dat", "w");
fwrite( items, sizeof items, 1, output );
fclose( output );
return 0;
}
但最后,这是最简单的
如果您不关心可读性和可移植性,fwrite
解决方案效果很好,但是如果结构中有任何指针成员,您仍然需要小心 不清楚你在问什么。你能为你的问题添加一些代码,这样我们就能更好地理解它吗?只需将结构指针传递给指令。你不需要写会员。我稍后会补充,现在我只能使用智能手机上网
#include <stdio.h>
int main(void)
{
struct foo {
int x;
char *name1;
char *name2;
} items[] = {{1,"one","ONE"}, {2,"two","TWO"}};
FILE *output = fopen("binio.dat", "w");
fwrite( items, sizeof items, 1, output );
fclose( output );
return 0;
}
john@marvin:~/Development/Prototypes/C/binio$ cat binio.dat
��������john@marvin:~/Development/Prototypes/C/binio$
john@marvin:~/Development/Prototypes/C/binio$ od -c binio.dat
0000000 001 \0 \0 \0 260 205 004 \b 264 205 004 \b 002 \0 \0 \0
0000020 270 205 004 \b 274 205 004 \b
0000030
#include <stdio.h>
int main(void)
{
struct foo {
int x;
char *name1;
char *name2;
} items[] = {{1,"one","ONE"}, {2,"two","TWO"}};
FILE *output = fopen("binio.dat", "w");
int i;
for (i = 0; i < sizeof items / sizeof items[0]; i++)
{
fprintf(output, "%d %s %s\n", items[i].x, items[i].name1, items[i].name2);
}
fclose( output );
return 0;
}
john@marvin:~/Development/Prototypes/C/binio$ cat binio.dat
1 one ONE
2 two TWO
int printFoo( FILE *output, const struct foo item )
{
return fprintf( output, "%d %s %s\n", item.x, item.name1, item.name2);
}