2013-07-20 3 views
0

Я прочитал программу в книге, в которой мы должны читать и писать структуры в файл, используя 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 
} 

я выделить память для всех структур и инициализировать значения для идентификатора и установить в структуре адресов и строк в структуре базы данных.

Затем я записываю структуры в файл.

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

Извините, все. Это была опечатка :) – Ajit

ответ

1

Я думаю, вы не прочитали документ о fread.
пожалуйста проверка его на man fread

файл для чтения в буфер, как этот

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

PTR является указателем на память, где содержимое файла считывается в.

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 и т. Д.

+0

Спасибо большое! Я думаю, что я все еще не уверен, как работает fwrite. Ваш код, кажется, предполагает, что вместо перезаписи файла он добавляет данные из источника в конец файла. Я прав? – Ajit

+0

№ приведенного выше кода записывает файл в текущий указатель файла, после чего указатель файла обновляется. Чтобы застраховать только добавление, откройте файл в режиме добавления «a» или «a +». – chux