0

我在一本书中读了一个程序,其中我们必须使用 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);

我得到一个分段错误。

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

4

2 回答 2

1

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

像这样将文件读入缓冲区

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

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

于 2013-07-20T12:35:06.017 回答
1

你需要一个关于如何写作和阅读的计划struct Address。为简洁起见,我将忽略setandemail字段。你需要决定如何划分你的字符串,如果有的话。\n为了便于使用,我使用了尾随fgets()。您需要确定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 名称等。

于 2013-07-20T14:34:54.557 回答