我在一本书中读到了一个程序,我们必须使用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);
我遇到了分段错误。
现在我猜这不是从文件中读取变量的正确方法。 任何人都可以帮我这个代码吗?
答案 0 :(得分:1)
我猜你还没看过有关恐惧的文件 请在man fread
结帐像这样将文件读入缓冲区
int fc = fread(ptr, sizeof(int), 1, fp);
ptr 是指向文件内容读入的内存的指针。
答案 1 :(得分:1)
你需要一个关于如何写作的计划&阅读struct Address
。为简洁起见,我将忽略set
和email
字段。如果有的话,您需要决定如何划分字符串。为了方便使用\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名称等