C - 如何在文件中存在结构体的情况下保持数组
这是我迄今为止所得到的结果,但实际上并没有在文件中写入。我想我没有使用正确的fwrite()C - 如何在文件中存在结构体的情况下保持数组
typedef struct t_directory {
int index;
char nombre[255];
int padre;
}t_directory;
int main(void) {
t_directory* tabla[100];
int i;
for(i=0; i<100;i++){
tabla[i] = malloc(sizeof(struct t_directory));
tabla[i]->index = 0;
sprintf(tabla[i]->nombre, "");
tabla[i]->padre = 0;
}
tabla[0]->index = 0;
sprintf(tabla[0]->nombre, "root");
tabla[0]->padre= -1;
tabla[1]->index = 1;
sprintf(tabla[1]->nombre, "user");
tabla[1]->padre= 0;
FILE * file= fopen("directorios.txt", "wb");
if (file != NULL) {
fwrite(tabla[0], sizeof(struct t_directory), sizeof(struct t_directory), file);
for(i=1;i<100;i++){
if(tabla[i]->index != 0){
fwrite(tabla[i], sizeof(struct t_directory), sizeof(struct t_directory), file);
}
}
fclose(file);
}
我应该怎么做呢?
首先,该文件是二进制所以你不应该真的能够将其作为文本阅读。
其次,你的问题的根源,是怎么写的结构:
fwrite(tabla[0], sizeof(struct t_directory), sizeof(struct t_directory), file);
如果你读如this fwrite
reference你会看到两个大小论点是:
- 数据结构
- 的数量的数据结构的
你得到第二尺寸参数错误的大小,和呼叫尝试总共写入sizeof(struct t_directory) * sizeof(struct t_directory)
字节到文件,每次您拨打fwrite
。
正确的应该是写一个结构:
fwrite(tabla[0], sizeof(struct t_directory), 1, file);
// ^
// Note the value one here, to write only a single structure
如果你不关心磁盘上的空间(这将是最小的为你的表),那么我建议你写整个阵列在一个去。
对于这个工作,你当然需要有对象代替指针数组:
t_directory tabla[100];
然后,你可以把它写在同一个电话:
fwrite(tabla, sizeof tabla[0], sizeof tabla/sizeof tabla[0], file);
结构可能有对齐问题,有些东西不明显 –
@JacekCz编译器很可能会添加填充,所以它不应该是一个问题。除非文件被复制到具有不同对齐要求或课程的另一个平台。 –
在一次操作中读取N,并且Nx1可能有错误。也许。 –
不要在C中使用更合适的语言。 – Ben
'fwite(data,size_of_one_piece,count_of_pieces,file)'你使用第三个参数错误 –
@BensaysNotoPoliticsonSO很遗憾我必须使用C – Marco