代码之家  ›  专栏  ›  技术社区  ›  Midas

将结构保存到文件

c
  •  3
  • Midas  · 技术社区  · 14 年前

    我想将多维数组保存到文件中。结构,例如:

    struct StructSub {
        unsigned short id;
    };
    struct MyStruct {
        struct StructSub sub[3];
    };
    
    // Use the struct
    struct MyStruct main;
    int i = 0;
    while (i < 3) {
        main.sub[i].id = i;
        i++;
    }
    

    对于此示例,我希望将数据保存为以下格式的文件(普通文本):

    MyStruct main {
        StructSub sub[0] {
            id = 0;
        }
        StructSub sub[1] {
            id = 1;
        }
        StructSub sub[2] {
            id = 2;
        }
    }
    

    最简单的方法是什么?

    6 回复  |  直到 14 年前
        1
  •  2
  •   Jon Purdy    14 年前

    我猜这样的事情更像是你想要的。它不像它可能的那么简单,但是它非常简单,并且可以很容易地扩展以适应其他结构。

    void WriteIndent(FILE* file, int indent) {
        int i = 0;
        while (i < indent) {
            fprintf(file, "\t");
            ++i;
        }
    }
    
    
    void WriteStructSub(FILE* file, StructSub* s, char* id, int indent) {
    
        WriteIndent(file, indent);
        fprintf(file, "StructSub %s {\n", id);
    
        WriteIndent(file, indent + 1);
        fprintf(file, "id = %i;\n", s->id);
    
        WriteIndent(file, indent);
        fprintf(file, "}\n");
    
    }
    
    
    void WriteMyStruct(FILE* file, MyStruct* s, char* id, int indent) {
    
        WriteIndent(file, indent);
        fprintf(file, "MyStruct %s {\n", id);
        int i = 0;
    
        while (i < 3) {
    
            char name[7];
            sprintf(name, "sub[%i]", i);
    
            WriteStructSub(file, &s->sub[i], name, indent + 1);
            ++i;
    
        }
    
        WriteIndent(file, indent);
        fprintf(file, "}\n");
    
    }
    
    
    int main(int argc, char** argv) {
    
        MyStruct s;
        int i = 0;
        while (i < 3) {
            s.sub[i].id = i;
            ++i;
        }
    
        FILE* output = fopen("data.out", "w");
        WriteMyStruct(output, &s, "main", 0);
        fclose(output);
    
    }
    
        2
  •  6
  •   Maister    14 年前

    请记住,将原始结构保存到这样的文件根本不可移植。编译器可能会向结构添加填充(更改sizeof(您的结构)),endianness可能不同,等等。但是,如果这无关紧要,那么fwrite()可以正常工作。

    请记住,如果您的结构包含任何指针,您希望写入指针指向的数据,而不是指针本身的值。

        3
  •  3
  •   Pramendra Gupta    14 年前

    试试这个

    struct StructSub {
        unsigned short id;
    };
    struct MyStruct {
        struct StructSub sub[10];
    };
    
    // Use the struct
    struct MyStruct main;
    int i = 0;
    while (i < 10) {
        main.sub[i].id = i;
    }
    

    写入文件

    FILE* output;
    output = fopen("Data.dat", "wb");
    fwrite(&main, sizeof(main), 1, output);
    fclose(output);
    

    读取文件

    struct Data data;
    FILE* input;
    input = fopen("Data.dat", "rb");
    fread(&main, sizeof(main), 1, input);
    // you got the data from the file!
    fclose(input);
    

    这些链接支持上述代码的全部内容 - http://c-faq.com/struct/io.html

    fwrite(&somestruct, sizeof somestruct, 1, fp);
    
        4
  •  2
  •   Community Ian Goodfellow    7 年前

    你可以用 Serialization 可以执行此操作的库。

    如果你可以使用C++,那就有 Boost::Serialization 图书馆就是为了这个。您也可以结账:

    1. s11n 图书馆。
    2. 这个 answer .
    3. Tpl 图书馆。
        5
  •  1
  •   jay.lee    14 年前

    你可以使用基本的文件IO,只要确保你写的 二元的 .

    FILE * pFile;
    pFile = fopen( "structs.bin","wb" );
    if ( pFile!=NULL ) {
      frwite( main, 1, sizeof(struct MyStruct), pFile );
      fclose (pFile);
    }
    

    如果你这样做的话,它不是最有平台的便携式,因为有必要考虑。

        6
  •  1
  •   pmg    14 年前

    除了对象的名称 main 这可能会给你带来很多奇怪的问题:仅仅是暴力——没有更好的方法:)

    /* pseudo code */
    write struct header
    foreach element
        write element header
        write element value(s)
        write element footer
    endfor
    write struct footer