C 从文件读入变量

C 从文件读入变量,c,structure,file-handling,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

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

然后我将结构写入一个文件

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);
我有一个分割错误

现在我猜这不是从文件中读取变量的正确方法。
有人能帮我把这段代码运行起来吗?

我想你还没有读过关于fread的文档。
请在

像这样将文件读入缓冲区

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

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

您需要一个如何写入和读取
结构地址的计划。为简洁起见,我将忽略
设置
电子邮件
字段。你需要决定如何标定你的字符串,如果有的话。为了便于使用
fgets()
,我使用了尾随的
\n
。您需要确定
int
是以字节(2,4,8,…)还是ASCII字符的形式写入/读取。使用的OP示例
fwrite()
,我建议使用fprintf()和“%d”

当然,然后调用函数

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;
}

一个健壮的解决方案是非常重要的—这取决于您的错误检查:最大字符串长度、writer和reader上不同的
int
范围、如何处理名称中不可打印的字符、文件错误、内存释放、空名称等。

对不起大家。那是个打字错误:)非常感谢!我想我还是不确定fwrite是如何工作的。您的代码似乎表明,它不会覆盖文件,而是将源数据附加到文件的末尾。我说的对吗?不对。上面的代码将文件a写入当前文件指针,然后更新文件指针。要确保仅追加,请在追加模式“a”或“a+”下打开文件。