C 如何将结构写入文件?
我试着在多个地方查找,但我不明白为什么fwrite不起作用 如果我有一个包含100个字段的结构,我就不想使用带有100个格式说明符的fprintfC 如何将结构写入文件?,c,file,file-io,syntax,structure,C,File,File Io,Syntax,Structure,我试着在多个地方查找,但我不明白为什么fwrite不起作用 如果我有一个包含100个字段的结构,我就不想使用带有100个格式说明符的fprintf struct emp { char name[15]; int age; int salary; char address[30]; }; int main() { char str[60]; struct emp emp1[5] = {{"Yoda",23,45000,"Asia
struct emp
{
char name[15];
int age;
int salary;
char address[30];
};
int main()
{
char str[60];
struct emp emp1[5] = {{"Yoda",23,45000,"Asia"},{"Darth",34,2344,"NAmerica"},{"Jabba",22,5566,"Africa"},{"Luke",33,3399,"SAmerica"},{"Laya",44,6677,"Europe"}};
FILE *fp;
fp = fopen("C:/.../sampleText.txt","w");`
int i=0;
for(i=0; i<5; i++)
{
fwrite(&emp1[i],sizeof(emp1[i]),1,fp);
//fprintf(fp,"%s, %d, %d, %s\n",&emp1[i].name,emp1[i].age,emp1[i].salary,emp1[i].address);
}
fclose(fp);
getch();
}
struct emp
{
字符名[15];
智力年龄;
国际工资;
字符地址[30];
};
int main()
{
char-str[60];
结构emp emp1[5]={{“尤达”,234500,“亚洲”},{“达斯”,342344,“北美”},{“贾巴”,225566,“非洲”},{“卢克”,333399,“萨默里卡”},{“莱亚”,446677,“欧洲”};
文件*fp;
fp=fopen(“C:/…/sampleText.txt”,“w”)`
int i=0;
对于(i=0;i有两个答案:
如果一切都设置正确,并且将写入的数据移植到其他机器不是问题,那么它确实可以工作
如果您在数据结构中有大量常见功能,或者需要将数据从一种类型的计算机(如Intel计算机)移动到另一种类型(如PowerPC或SPARC),则此功能不起作用
在示例结构中,没有指针,因此可以将结构逐字写入文件,然后在同一(类型)计算机上运行的程序的另一次调用中,可以将其读回,并且可以看到相同的数据
但是,如果您的结构包含指针,则无法有意义地将该结构写入磁盘。程序的一次调用中的指针在程序的另一次调用中不必有任何意义。如果需要在小端(Intel)和大端(PowerPC、SPARC)之间移植数据您必须使用与平台无关的方式访问数据;简单地将数据写入磁盘是行不通的
因此,在可移植性不是问题的地方,这段代码应该可以工作-Unix或Windows。它使用“wb”
和“rb”
参数来fopen()
因为数据是二进制数据,而不是纯文本。b
是可选的,但在Unix上是无害的;它在Windows上是至关重要的。该代码还将文件名固定为sampledata.bin
以便可以在任何平台上运行,写入当前目录。它写入数据,然后读取数据,然后比较读取的数据有了书面数据,报告任何问题。如果程序什么也没说,一切正常
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
struct emp
{
char name[15];
int age;
int salary;
char address[30];
};
int main(void)
{
char const filename[] = "sampledata.bin";
struct emp emp1[5] =
{
{ "Yoda", 23, 45000, "Asia" },
{ "Darth", 34, 2344, "N America" },
{ "Jabba", 22, 5566, "Africa" },
{ "Luke", 33, 3399, "S America" },
{ "Leia", 44, 6677, "Europe" },
};
struct emp emp2[5];
FILE *ifp;
FILE *ofp;
int i;
ofp = fopen(filename, "wb");
if (ofp != 0)
{
if (fwrite(emp1, sizeof(emp1), 1, ofp) != 1)
{
fprintf(stderr, "Failed to write to %s\n", filename);
exit(1);
}
fclose(ofp);
}
ifp = fopen(filename, "rb");
if (ifp != 0)
{
if (fread(emp2, sizeof(emp2), 1, ifp) != 1)
{
fprintf(stderr, "Failed to read from %s\n", filename);
exit(1);
}
fclose(ifp);
}
for (i = 0; i < 5; i++)
{
if (emp1[i].age != emp2[i].age ||
emp1[i].salary != emp2[i].salary ||
strcmp(emp1[i].name, emp2[i].name) != 0 ||
strcmp(emp1[i].address, emp2[i].address) != 0)
printf("Difference in record %d\n", i);
}
return 0;
}
您没有指定您所说的“编写不起作用”
,但我假设您在Windows上工作,在这种情况下,您需要指定“wb”
到fopen
。默认情况下,在Windows上,它是以文本模式编写的(即“wt”
)
看看这个问题和答案。你的问题有一个很好的答案和解释。
数据序列化是一项非常重要的任务。正如其他一些人所指出的,在某些情况下,可以将结构的内容作为二进制数据写入磁盘。这是最简单的写入方法,但不太可能是稳定的。每次重新编译代码时,可能会更改写入和读取数据的格式
您最好的选择是使用标准的数据交换格式,如CSV、XML或JSON。有许多现有的工具可以使用这些格式,因此您应该考虑使用其中的一种
0x0000: 59 6F 64 61 00 00 00 00 00 00 00 00 00 00 00 00 Yoda............
0x0010: 17 00 00 00 C8 AF 00 00 41 73 69 61 00 00 00 00 ........Asia....
0x0020: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
0x0030: 00 00 00 00 00 00 00 00 44 61 72 74 68 00 00 00 ........Darth...
0x0040: 00 00 00 00 00 00 00 00 22 00 00 00 28 09 00 00 ........"...(...
0x0050: 4E 20 41 6D 65 72 69 63 61 00 00 00 00 00 00 00 N America.......
0x0060: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
0x0070: 4A 61 62 62 61 00 00 00 00 00 00 00 00 00 00 00 Jabba...........
0x0080: 16 00 00 00 BE 15 00 00 41 66 72 69 63 61 00 00 ........Africa..
0x0090: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
0x00A0: 00 00 00 00 00 00 00 00 4C 75 6B 65 00 00 00 00 ........Luke....
0x00B0: 00 00 00 00 00 00 00 00 21 00 00 00 47 0D 00 00 ........!...G...
0x00C0: 53 20 41 6D 65 72 69 63 61 00 00 00 00 00 00 00 S America.......
0x00D0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
0x00E0: 4C 65 69 61 00 00 00 00 00 00 00 00 00 00 00 00 Leia............
0x00F0: 2C 00 00 00 15 1A 00 00 45 75 72 6F 70 65 00 00 ,.......Europe..
0x0100: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
0x0110: 00 00 00 00 00 00 00 00 ........
0x0118: