2015-07-01 2 views
-1

Im после урока http://c.learncodethehardway.org/book/ex17.html "Обучение C The Hard Way", там, кажется, ошибка с функцией называется Database_load: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."); 
} 

Функция возвращает «Failed для загрузки базы данных ".

Я попытался использовать отладчик и просмотрел документы 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 [email protected] 

Это вывод программы:

Database_load(struct Connection *conn) 

conn is not null 

conn->file is not null 

ERROR: Failed to load database. 

Как я могу исследовать это, что может быть причиной проблемы?

+1

Вы можете использовать 'perror', чтобы понять, что пошло не так. –

+0

Вы проверяете 'conn! = 0' и все еще разыгрываете' conn', если это появляется, как в книге, перестаньте его читать. –

ответ

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) после ошибки.
Смежные вопросы