【问题标题】:reading into a variable from a file从文件中读入变量
【发布时间】:2013-07-20 12:24:00
【问题描述】:

我在一本书中读到一个程序,其中我们必须使用 fread 和 fwrite 读写结构到文件。

struct Address {
    int id;
    int set;
    char *name;
    char *email;
}

struct Database {
    int rows;             //number of rows
    struct Address *row;  //pointer to a row in the database
}

struct Connection {
    FILE *fp;
    struct Database *db
}

我为所有结构分配内存并初始化 id 的值,并在地址结构和数据库结构中设置行。

然后我将结构写入文件。

int fc = fwrite(conn->db, sizeof(*conn->db->row) * number + sizeof(int), 1, conn->fp);
if(fc != 1) printf("Error");

现在我正在尝试从文件中读取 conn->db->rows 的值

int fc = fread(&conn->db->rows, sizeof(int), 1, conn->fp);

我得到一个分段错误。

现在我猜这不是从文件中读取变量的正确方法。 谁能帮我让这段代码正常工作?

【问题讨论】:

  • 对不起大家。那是一个错字:)

标签: c structure file-handling


【解决方案1】:

我猜你还没有阅读关于 fread 的文档。
请在man fread查看它

像这样将文件读入缓冲区

int fc = fread(ptr, sizeof(int), 1, fp);

ptr是指向文件内容读入的内存的指针。

【讨论】:

    【解决方案2】:

    您需要一个关于如何写作和阅读struct Address 的计划。为简洁起见,我将忽略 setemail 字段。你需要决定如何划分你的字符串,如果有的话。为了便于使用fgets(),我使用了尾随\n。您需要确定 int 是作为字节(2、4、8、...)还是 ASCII 字符写入/读取。 OP 示例使用fwrite(),我推荐 fprintf() & "%d"。

    当然,然后调用函数rows 次。

    int WriteAddress(FILE *f, const struct Address *A) {
      size_t L = A->name ? (strlen(A->name) + 1) : 0;
      if ((1 != fwrite(&(A->id), sizeof(A->id), 1, f)) ||
         (L != fwrite(A->name, 1, L, f)) ||
         (1 != fwrite("\n", 1, 1, f))) {
        return  1; // failure
      }
      return 0; // No problem
    }
    
    int ReadAddress(FILE *f, struct Address *A) {
      A->id = 0;
      A->name = 0;
      #define MAXNAME (1000)
      char buf[MAXNAME+1];
      if (1 != fread(&(A->id), sizeof(A->id), 1, f)) return 1; // error
      if (fgets(buf, sizeof(buf), f) == NULL) return 1; // error
      A->name = strdup(buf);  // could check for NULL here
      return 0;
    }
    

    一个强大的解决方案是非常重要的 - 取决于您的错误检查:最大字符串长度、写入器和读取器的不同 int 范围、如何处理名称中的不可打印字符、文件错误、内存释放、NULL 名称等。

    【讨论】:

    • 非常感谢!我想我仍然不确定 fwrite 是如何工作的。您的代码似乎建议不要覆盖文件,而是将数据从源附加到文件末尾。我说的对吗?
    • 没有。上面的代码将文件写入当前文件指针,然后更新文件指针。为确保仅追加,请以追加模式“a”或“a+”打开文件。
    猜你喜欢
    • 2014-06-18
    • 1970-01-01
    • 1970-01-01
    • 2016-07-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-06-26
    相关资源
    最近更新 更多