从文件中读取混合值并将其存储在结构数组中

时间:2019-01-10 04:17:41

标签: c

我正在做作业,并且遇到一些问题。

我需要读取一个包含数字和字符串的文件,并将值存储在数组中。

我正在读取的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 :(得分:3)

节省时间。启用所有编译器警告。

  

警告:格式'%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"可以,但是这里不需要。

使用面向 line 的数据,最好使用fgets()读取 line ,然后对其进行解析。应付格式错误的输入要容易得多。