从文件中读取变量

时间:2013-07-20 12:24:01

标签: c structure file-handling

我在一本书中读到了一个程序,我们必须使用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->行的值

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

我遇到了分段错误。

现在我猜这不是从文件中读取变量的正确方法。 任何人都可以帮我这个代码吗?

2 个答案:

答案 0 :(得分:1)

我猜你还没看过有关恐惧的文件 请在man fread

结帐

像这样将文件读入缓冲区

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

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

答案 1 :(得分:1)

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