C 如何将结构写入文件?

C 如何将结构写入文件?,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

我试着在多个地方查找,但我不明白为什么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"},{"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: