fread()未成功返回

时间:2015-07-01 22:00:49

标签: c mingw fread

我遵循教程http://c.learncodethehardway.org/book/ex17.html,"学习C艰难的方式",似乎有一个名为Database_load 的函数的错误:

server.connection({
    port: 3000,
    routes: {
        json: {
            space: 4
        }
    }
});

该函数返回"无法加载数据库。"。

我尝试使用调试器,并查看 fread()文档,但我无法确定此函数成功返回的原因。

我重写了这个函数,打印出一些完整性检查测试:

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.");
}

下面是cmd输入:

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.");
}

这是节目输出:

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

我如何进一步探讨这可能导致问题的原因?

1 个答案:

答案 0 :(得分:1)

思路:

  1. 仔细检查打开conn->file的代码。 (是否可以阅读,模式"r""rb"?)
  2. 初次设置数据库结构时,将conn->文件设置为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)