Чтение смешанных значений из файла и сохранение их в структурном массиве - PullRequest
0 голосов
/ 10 января 2019

Я работаю над домашней работой и сталкиваюсь с некоторыми проблемами.

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

TXT-файл, из которого я читаю, похож на следующий

    50090607;ApoBank Frankfurt Main
    51220800;Banco do Brasil Frankfurt
    10020500;Bank fur Sozialwirtschaft
    66090800;BBBank Karlsruhe
    10000000;BBk Berlin 

Я написал этот код, но, похоже, он не работает.

 //IBAN.c

typedef struct {
  int banknumber;
  char bankname[50];
} Bankdata;

int main(void) {

  FILE *BLZ1;
  Bankdata *Bank;
  int i = 0;
  int size = 10;

  Bank = (Bankdata*) malloc(sizeof(Bankdata) * size);
  BLZ1 = fopen("BLZ1.txt", "r");
  if (BLZ1 == NULL) {
    printf("File not found");
    exit(1);
  }

  while (!feof(BLZ1)) {

    fscanf(BLZ1, "%d;%50[^\n]\n", Bank[i].banknumber, Bank[i].bankname);
    printf("%d , %s\n", Bank[i].banknumber, Bank[i].bankname);
    i++;
    if (i >= size) {
      size += 10;
      Bank = realloc(Bank, sizeof(Bankdata) * size);
    }
  }
  fclose(BLZ1);

  return 0;
}

У кого-нибудь есть предложения?
Любая помощь будет принята с благодарностью.

1 Ответ

0 голосов
/ 10 января 2019

Экономьте время. Включить все предупреждения компилятора.

предупреждение: формат "% d" ожидает аргумент типа "int *", но аргумент 3 имеет тип "int" [-Wformat =]

Спецификатор *printf "%d" ожидает совпадения int. Но это не printf().
Спецификатор *scanf "%d" ожидает совпадения int *, а не int.

    // fscanf(BLZ1, "%d;%50[^\n]\n", Bank[i].banknumber, Bank[i].bankname);
    fscanf(BLZ1, "%d;%49[^\n]\n", &Bank[i].banknumber, Bank[i].bankname);
    //    Add & here -------------^

Также: используйте 49, чтобы ограничить сканирование до 49 символов, позволяя сохранить эти 49 и нулевой символ в char bankname[50]; @ David C. Rankin


Дополнительные проблемы:

Лучший код будет проверять возвращаемое значение из fscanf(), чем использовать feof().

// while (!feof(BLZ1)){
while (fscanf(BLZ1, "%d;%49[^\n]\n" , &Bank[i].banknumber , Bank[i].bankname) == 2) {
  printf("%d , %s\n" , Bank[i].banknumber , Bank[i].bankname);
  i++;
  if (i >= size){
    size +=10;
    Bank = realloc(Bank , sizeof(Bankdata)*size);
  }
}

Финальный "\n" в "%d;%49[^\n]\n" в порядке, но здесь не нужен.

С ориентированными на строку данными лучше всего прочитать строку с помощью fgets() и затем проанализировать ее. Намного легче справиться с неправильным вводом.

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