У меня есть .dat-файл, который нужно читать и печатать записи для людей , которые имеют атрибуты, указанные в качестве аргументов командной строки. Формат файла выглядит следующим образом. Записи для каждого человека начинается с беззнаковым 32-битным целым, которое содержит различную информацию о человеке:Чтение данных из двоичного файла .dat
Биты
0-4: длина первого имени (ключ = первом)
5-9 : длина отчества (ключ = средний)
10-14: длина фамилии (ключ = последний)
15-21: возраст (ключ = возраст)
22 : Пол (0 = мужчина, 1 = женский) (ключ = пол)
23-28: состояние (от 0 до 49 в алфавитном порядке) (ключ = состояние)
29: в настоящее время в браке (0 = ложь , 1 = истина) (ключ = женатый)
30: занятые полный рабочий день (используется 0 = ложь, 1 = истина) (ключ =)
31: учился в колледже (0 = ложь, 1 = истина) (key = college)
Я думаю, что я предполагаю сначала прочитать все 32-битные (4 байта), а затем читать по биту из 32-битного целого числа. Я новичок в fread и fseek, поэтому я действительно не знаю, нахожусь ли я на правильном пути, любая помощь будет оценена. Вот мои коды до сих пор.
int main(int argc, char *argv[]) {
char *buf;
long lSize;
size_t result;
FILE *fp;
fp = fopen("/u1/junk/people.dat","r");
if(fp == NULL) {
printf("Error: can't open file to read\n");
return -1;
}
else {
printf("File people.dat opened successfully to read\n");
}
//obtian file size
fseek(fp, 0, SEEK_END);
lSize = ftell(fp);
rewind(fp);
//allocate memory to contain the whole file
buf = (char*) malloc (sizeof(char)*lSize);
while (!feof(fp)) {
fread(buf, 4, 1, fp);
fseek(fp, i, SEEK_CUR);
fread(buf, 32, 1, fp);
printf("%s\n", buf);
i+=32;
}
fclose(fp);
return 0;
}
Два основных советов: Не отвергни возвращаемое значение 'таНос()' в C, не используйте 'feof()' для обнаружения конца файла, как это. – unwind
Я думаю, вы должны придумать структуру с битовыми полями и прочитать всю информацию за один раз. –
@ facebook-100001358991487 Я любезно не согласен, потому что это не переносная реализация, хотя OP не упомянула, нужна ли им переносимость. Я бы предпочел видеть, что OP заполняет структуру поле за полем. – siliconwafer