我想将多维数组保存到文件中。结构例如:
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;
}
}
最简单的方法是什么?
答案 0 :(得分:6)
请记住,将原始结构保存到这样的文件根本不可移植。编译器可能会向struct添加填充(更改sizeof(your_struct)),endianness可能会有所不同等等。但是,如果这是无关紧要的,那么fwrite()可以正常工作。
请记住,如果你的struct包含任何指针,你想要写指针指向的数据,而不是指针本身的值。
答案 1 :(得分:3)
试试这个
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);
答案 2 :(得分:2)
答案 3 :(得分:2)
我猜这样的事情更像是你想要的。它并不尽可能简洁,但它非常简单,可以很容易地扩展到容纳其他结构。
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);
}
答案 4 :(得分:1)
您可以使用基本文件,只需确保使用二进制文件。
FILE * pFile;
pFile = fopen( "structs.bin","wb" );
if ( pFile!=NULL ) {
frwite( main, 1, sizeof(struct MyStruct), pFile );
fclose (pFile);
}
如果你这样做的话,它不是最容易移植的平台,因为需要考虑字节序。
答案 5 :(得分:1)
除了main
对象的名称之外,这可能会给你带来许多奇怪的问题:只是暴力破解它 - 没有更好的方法:)
/* pseudo code */
write struct header
foreach element
write element header
write element value(s)
write element footer
endfor
write struct footer