Чтение бинарного файла на си
В файле записана структура в бинарном виде, сначала идет массив char(слово), потом число и все это повторяется с новой строки, количество которых известно заранее. Вопрос простой и одновременно сложный, а как собственно считать эти значения (пишу их в структуру), пока не выходит как я написал.
// структура
struct st
{
char* nam;
int count;
};
// сама запись в файл
FILE* fp = fopen("file.bin", "wb+");
char new_str = '\n';
if (fp == NULL) {
printf("Can't open file\n");
return;
}
for (int i = 0; i < size; i++) {
fwrite(&(st[i].nam), sizeof(char), strlen(st[i].nam), fp);
fwrite(&(st[i].count), sizeof(int), 1, fp);
fwrite(&(new_str), sizeof(char), 1, fp);
}
fclose(fp);
FILE* fp = fopen("file.bin", "rb");
if (fp == NULL) {
printf("Can't open file\n");
return;
}
rewind(fp);
for (int i = 0; i < size; i++) {
fread(&(st[i].nam), sizeof(char), strlen(st[i].nam), fp);
fread(&(st[i].count), sizeof(int), 1, fp);
}
fclose(fp);
Ответы (1 шт):
Надо при записи сначала писать число выводимых байтов строки. При чтении - читать число байтов, выделять необходимую память и уже в нее записывать.
for (int i = 0; i < size; i++) {
int len = strlen(st[i].nam);
fwrite(&len,sizeof(len),1,fp);
fwrite(st[i].nam, sizeof(char), len, fp);
fwrite(&(st[i].count), sizeof(int), 1, fp);
}
Чтение:
for (int i = 0; i < size; i++) {
int len;
fread(&len,sizeof(len),1,fp);
st[i].nam = (char*)calloc(len+1);
fread(st[i].nam, sizeof(char), len, fp);
fread(&(st[i].count), sizeof(int), 1, fp);
}
В пределах одной программы, когда все указатели на месте и указывают на строки с выделенной памятью - может проскочить неверное чтение. Чтобы действительно убедиться что все верно, писать надо в одной программе, а читать в другой.