gpt4 book ai didi

c - fread() 未成功返回

转载 作者:行者123 更新时间:2023-11-30 19:16:02 25 4
gpt4 key购买 nike

我正在关注教程 http://c.learncodethehardway.org/book/ex17.html ,“艰难地学习 C”,名为 Database_load 的函数似乎有一个错误:

void Database_load(struct Connection *conn)
{
int rc = fread(conn->db, sizeof(struct Database), 1, conn->file);
if(rc != 1) die("Failed to load database.");
}

函数返回“加载数据库失败。”。

我尝试使用调试器,并查看了 fread() 文档,但我无法弄清楚为什么这个函数成功返回。

我重写了该函数以打印一些健全性检查的测试:

void Database_load(struct Connection *conn)
{
printf("Database_load(struct Connection *conn)\n");
if (conn!=0)
{
printf("conn is not null\n");
if (conn->file!=0)
{
printf("conn->file is not null\n");
}//file is not null

}//end conn is not null

//actual read from filesystem
int rc = fread(conn->db, sizeof(struct Database), 1, conn->file);

if (!conn->db!=0)
{
printf("conn->db is not null\n");
}//db is not null

if(ferror(conn->file))
{
printf("Error in reading from file\n");
}

if(rc != 1) die("Failed to load database.");
}

以下是cmd输入:

PS C:\Users\xyz\workspace_cpp\the_hard_way\ex17> .\ex_17.exe db.dat s 1 ary ary@yahoo.com

这是程序输出:

Database_load(struct Connection *conn)

conn is not null

conn->file is not null

ERROR: Failed to load database.

我如何进一步探索这个问题,可能是什么导致了这个问题?

最佳答案

想法:

  1. 仔细检查打开conn->file的代码。 (它是否开放阅读,模式为 "r" 还是 "rb"?)
  2. 在最初设置数据库结构时将 conn->file 设置为 NULL;这将有助于发现您忘记打开它的情况。
  3. 暂时将 fread 调用更改为 fread(conn->db, 1, sizeof(struct Database), conn->file) 并检查返回值;查看它是否大于 0 但小于 sizeof(struct Database)
  4. 尝试调用 getc(conn->file) 看看是否得到 EOF 或字符。
  5. 一定要在错误发生后调用 perror() 或打印出 strerror(errno)

关于c - fread() 未成功返回,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31172446/

25 4 0
文章推荐: c# - 使用字符串列表过滤 Entity Framework
文章推荐: c# - Glass Mapper IEnumerable 到 IEnumerable