【问题标题】:Can I save a structure in a file, e.g txt.file?我可以将结构保存在文件中,例如 txt.file 吗?
【发布时间】:2014-01-20 11:54:37
【问题描述】:

我可以将结构保存在文件中,例如保存到 txt 吗?如果可以的话,是否可以重新打开它并取回数据?

可能是这样的:

struct guest
{
        int tel;
        char name[20];
        char country[20];
} ;

int main()
{

        record.tel=231231;
        strcpy(record.name, "Raju");
        record.country= China;

【问题讨论】:

  • 是的,你可以...
  • 您可以 - 只需定义一种标准方式来存储它,然后使用相同的方法检索它。
  • 你可以。但你很可能不想这样做。您想将这些东西存储在数据库中。如果您手边没有任何数据库,请选择 sqlite。
  • 使用fwrite, fread

标签: c


【解决方案1】:

基本上可以。你有两个选择。

1) 作为不可移植的二进制文件。

//  Writing to a file inticaded by fp ...
fwrite( &record, sizeof(struct guest), 1, fp );

// Reading from a file inticaded by fp ... 
fread( &record, sizeof(struct guest), 1, fp ); 

2) 作为文本,可移植。

//  Writing to a file inticaded by fp ...
fprintf( fp, "%d %20s %20s", record.tel, record.name, record.country );

// Reading from a file inticaded by fp ... 
fscanf( fp, "%d %s %s", &record.tel, &record.name, &record.country );

使用首选(二进制)可以直接从文件中读取,参见示例here,如果将其保存为文本,则必须逐行读取并在字段中手动输入值结构。

【讨论】:

  • 感谢您的解释和链接,这很有帮助。
【解决方案2】:

您描述的功能称为序列化
互联网上有很多信息。 例如。参考:
Data serialization in C?

【讨论】:

    【解决方案3】:
    fprintf(file, "%d %20s %20s\n", record.tel, record.name, record.country);
    fscanf(file, "%d %20s %20s\n", &record.tel, &record.name, &record.country);
    

    UPD:如果name 和/或country 可能包含空格,请使用以下内容回读:

    char blank[1];
    
    fscanf(file, "%d ", &record.tel);
    fread(record.name, 20, 1, file);
    fread(blank, 1, 1, file); // assert(blank[0] == ' ');
    fread(record.country, 20, 1, file);
    fread(blank, 1, 1, file); // assert(blank[0] == '\n');
    

    【讨论】:

      【解决方案4】:

      如果您是第一次使用fprintf() / fscanf() 而不是printf() / scanf()

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-05-21
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多