2009-07-29 104 views
6

我想将结构保存在文件中。 我想实现一个使这项工作的功能。 我试过这段代码,但没有奏效。如何保存文件中的结构.... C lang

struct utilisateur // enregestrement pour sauvegarder les details de l utilisateur 
{ 
char nom[20]; 
char prenom[20]; 
int place; 
char depart[20]; 
char arrive[20]; 
char sexe; 
int nwagon; 
}; 

struct utilisateur utilis; 
struct utilisateur *Table[48]; 

void crea_fich(struct utilisateur *Tutilis) 
// creation un fichier, vous introduiez le nom, et le sotcker par enreg 
{ 
    FILE *f; 
    if (f!==0) 
    { 
     printf("error in the name of file \n"); 
     exit(1); 
    } 
    if (f=fopen(futilis,"w")==Null){ 
     fprint("We can't creat file \n"); 
     exit(1); 
    } 
    else{ 
     f=fopen("futilis.dat","wb"); 
     fwrite(Tutilis ,sizeof(utilisateur),1,f); 
    } 
} 
+0

你在代码片段中有很多噪音,更不用说格式化问题了(并且表格的声明看起来很奇怪)。假设你的实际代码得到这么多,fwrite的结果与你期望的结果有什么不同? – brendan 2009-07-29 23:42:51

+0

嗨。你可以在你的问题中加入一些文字格式吗?这会让阅读变得更容易。 – anderstornvig 2009-07-29 23:43:04

+0

你在做什么“if(f!== 0)”?首先,“f”是未初始化的,所以在那时使用它就显然是错误的。其次,没有操作符“!==”;你的意思是使用“!=”。 – 2009-07-29 23:55:04

回答

0

我想看看在符号名第一,像NULLfprint,更不用说怪异\0。作为一个额外的想法,您应该在写入后关闭文件以确保它被刷新到磁盘,然后仔细检查futilis变量是否为包含有效可写路径的char*

6

不需要。您需要逐个写出数据成员。你不应该盲目地将你的结构的内存表示复制到文件输出缓冲区(这很清楚你正在尝试这么做)。以这种方式编写文件会导致文件不可移植(除了在写入的平台上,它们将不可读),这是由于结构元素的末端和平台特定的填充。

+3

好吧,他从来没有说过需要可移植性,所以没有直接将结构体写入文件系统的概念。例如,我已经知道一种或两种语言前端,他们的解析树数据就是这样做的。 – 2009-07-30 00:02:51

5

只是一个简单的例子:)

// your struct 
struct Data 
{ 
    int first; 
    double second; 
    char third[10]; 
}; 

然后写的结构!

struct Data data = {22, 4.0, "Hi"}; 
FILE* output; 

output = fopen("Data.dat", "wb"); 

fwrite(&data, sizeof(data), 1, output); 

fclose(output); 

最后从您创建的文件中读取数据!

struct Data data; 
FILE* input; 

input = fopen("Data.dat", "rb"); 

fread(&data, sizeof(data), 1, input); 

// you got the data from the file! 

fclose(input); 

如果没有写入和明智地阅读,二进制文件是恶梦。您必须关心许多关于创建文件的体系结构以及它将在何处读取的内容。永久性和变量的大小是最重要的。另外,如果在struct中有指针,则将写入文件的指针不是指针指向的实际数据。对不起,因为它充满了编译错误:)

我删除了我的第一个回答的我没有编辑您的代码,因为它真的错了,不好意思:)

6

试试这个,然后如果这不是在做什么你想尝试解释它与你想要的不同。

void crea_fich(struct utilisateur *Tutilis) 
{ 
    FILE *f; 
    size_t nwritten; 

    f = fopen("futilis.dat","wb"); 

    if (f == NULL) 
    { 
     fprintf(stderr, "Cannot open file for writing.\n"); 
     exit(1); 
    } 

    nwritten = fwrite(Tutilis, sizeof Tutilis[0], 1, f); 
    fclose(f); 

    if (nwritten < 1) 
    { 
     fprintf(stderr, "Writing to file failed.\n"); 
     exit(1); 
    } 
} 
6

Michael S是对的;使用fwrite与一个结构是非常不便携的。但是让我们假设你不关心这一点,并且你想要一些易于编写的东西可以工作。

您代码中的问题是您违反了黄金法则sizeof从未使用sizeof,其类型名称为。相反,您应该使用带有左值的sizeof,并且几乎总是使用对另一参数的解引用。因此,

Tutilis = malloc (sizeof (*Tutilis)); 
    ... 
fwrite(Tutilis, sizeof (*Tutilis), 1, f); 

如果你遵循这个秘诀,它是很难让尺寸错误。

1

我意识到这是一个旧帖子,但当人们搜索这些信息时就会出现,所以我会给出我自己的解决方案。

这基本上是我在我的游戏中使用过的东西。我在自己的函数中实际上有一些额外的库特定代码用于对话框,但实质上它就是这样。我分别写入数据。我不认为我有这个数据的结构,但没有区别,只需单独编写各个结构成员。如上所述,这样更好。

// returns 1 if successful, 0 if not 
int savemap(const char *map_name) 
{ 
    FILE *file = NULL; 

    // open the file in write binary mode 
    file = fopen(map_name, "wb"); 

    // always check return values to see if it was opened okay 
    if(file == NULL) { 
     fprintf(stderr, "Error opening file for writing.\n"); 
     return 0; 
    } 

    // write file ID, version and pills 
    fwrite(MAP_ID, sizeof(char), strlen(MAP_ID)+1, file); 
    fwrite(&MAP_VER, sizeof(unsigned char), 1, file); 
    fwrite(&pills, sizeof(unsigned short), 1, file); 

    // write the map data (unsigned int map[315]) 
    fwrite(&map, sizeof(unsigned int), 315, file); 

    // never forget to close the file 
    fclose(file); 

    return 1; 
} 
相关问题