Прочитать двоичный файл C программирования - PullRequest
0 голосов
/ 03 мая 2011

Я делаю программу для управления клиникой, но у меня проблема.Мне нужно прочитать двоичный файл с информацией от врачей.Информация это имя, код и телефон.Они вставляются пользователем.

Как я могу распечатать эту информацию отдельно.Например:

Имя: Джон Круз
Код: JC
Телефон: 90832324

Я пытаюсь использовать

typedef struct {
  char code[10];
  char name[100];
  int telephone;
} DOCTOR;


int newDoctor() {//This is the function that create the binary file
  DOCTOR d;
  FILE *fp;
  fp = fopen("Doctors.dat","wb");

  if(fp==NULL) {
    printf("Error!");
        return -1;
  }

  printf("Code\n");
  fflush(stdin);
  gets(d.code);
  printf("Name\n");
  gets(d.name);
  printf("Telephone\n");
  scanf("%d",&d.telephone);
  fprintf(fp,"%s;%s;%d",d.code,d.name, d.telephone);
  fclose(fp);
}

//And to open
FILE* fp;
fp=fopen("Doctors.dat","rb");

while(!EOF(fp)) {
  fgets(line, 100, fp);
  printf("%s",line);
}

Просто чтобы увидетьлиния, но она не работает, и как я могу отделить информацию?

С уважением

Ответы [ 3 ]

1 голос
/ 03 мая 2011

Вы должны знать формат, в котором находится двоичный файл, например, если вы сериализовали предыдущую структуру, вы можете прочитать ее в структуру того же типа:

typedef struct
{
   int stuff;
   double things;
} myStruct;

myStruct writeMe = {5, 20.5};

FILE* fp;
fp = fopen("Doctores.dat","wb");
if (fp == NULL) { fputs ("File error", stderr); exit(EXIT_ERROR); }

fwrite(writeMe, 1, sizeof(writeMe), fp);
fclose(fp);

Потом позже читать:

myStruct readMe;

FILE* fp2;
fp2 = fopen("Doctores.dat","rb");
if (fp2 == NULL) { fputs ("File error", stderr); exit(EXIT_ERROR); }

fread(readMe, 1, sizeof(readMe), fp2);
fclose(fp2);

printf("my int: %i\nmy double: %f", readMe.stuff, readMe.things);

Надеюсь, это поможет

1 голос
/ 03 мая 2011

Здесь есть как минимум две проблемы: формат файла и данных и чтение двоичного файла .Формат файла - это то, как информация организована в файле.Двоичное чтение предполагает чтение файла без каких-либо переводов.

Формат файла и данных

Для текстовых полей необходимо знать следующее:

  • Поле фиксированной или переменной длины.
  • Поле максимумаwidth.
  • Представление (завершено нулем, имеет фиксированную длину, дополняется, предшествует длина строки и т.Получить формат в письменной форме.Если вы не понимаете написанного, попросите первоначального автора переписать документацию или объяснить ее вам.

    Для целочисленных числовых полей вам необходимо знать следующее:

    • Размер числа в байтах.
    • Порядковый номер: первый байт является самым значимым (MSB)или Наименьшее значение (LSB)?
    • Подписано или Без знака
    • Одно или два дополнения

    Числа могут варьироваться от 1 "байта" до не менее 8 байтов,в зависимости от платформы.Если ваша платформа имеет собственное 32-битное целое число, но формат 16-битный, ваша программа будет читать 16 дополнительных бит из следующего поля.Нехорошо;плохо, очень плохо

    Для плавающей запятой: вам нужно знать представление.Существует много способов представления числа с плавающей запятой.Числа с плавающей точкой также могут быть очень большими.Некоторые платформы используют 32-битные, в то время как другие используют 80-битные и более.Опять же, ничего не предполагайте.

    Двоичное чтение

    В библиотеках C и C ++ нет магических методов для правильного чтения вашей структуры за один вызов функции;вам придется собирать поля самостоятельно.Одним из препятствий или проблем является тот факт, что компиляторы могут вставлять байты «заполнения» между полями.Это зависит от компилятора, а количество байтов заполнения не является стандартным.Это также известно как выравнивание .

    Двоичное чтение включает использование fread или std::istream::read.Распространенным методом является выделение буфера , считывание блока данных в буфер, а затем составление структур из этого буфера на основе спецификации формата файла.

    Сводка

    Перед чтением двоичного потока данных вам потребуется спецификация формата.Существуют различные способы представления данных, и внутреннее представление данных зависит от платформы.Двоичные данные лучше всего считывать в буфер, затем из буфера могут быть построены программные структуры и переменные.

    Текстовые представления проще для ввода.Если возможно, попросите, чтобы создатель файла данных использовал текстовые представления данных.Разделители полей тоже полезны.Такой язык, как XML, помогает организовать текстовые данные и обеспечивает формат в файле данных (но может быть слишком многословным для некоторых приложений).

1 голос
/ 03 мая 2011

fgets предполагает, что данные представляют собой строки ascii. Для двоичных данных вам необходимо знать двоичный формат и считывать данные в соответствующие структуры данных.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...