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

C 从文件中读取混合值并将其存储在结构数组中,c,C,我正在做作业,面临一些问题 我需要从包含数字和字符串的文件中读取数据,并将值存储在数组中 我从中读取的txt文件如下所示 50090607;ApoBank Frankfurt Main 51220800;Banco do Brasil Frankfurt 10020500;Bank fur Sozialwirtschaft 66090800;BBBank Karlsruhe 10000000;BBk Berlin 我写了这段代码,但似乎不起作用 //

我正在做作业,面临一些问题

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

我从中读取的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;
}
有人有什么建议吗?

任何帮助都将不胜感激。

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

警告:格式“%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]中


高级问题:

与使用
feof()
相比,更好的代码将测试来自
fscanf()的返回值

%d;%49[^\n]\n”
中的最后一个
“\n”
可以,但此处不需要


对于行定向数据,最好使用
fgets()
读取行,然后对其进行解析。更容易处理格式错误的输入。

您将需要查看。进一步的
%d;%49[^\n]“
(不要在末尾包含
'\n'
),并且必须限制字符以允许
'\0'
的空间。您必须始终验证
fscanf
的返回(
==2
在您的情况下)没有必要强制执行
malloc
的返回,这是不必要的。请参阅:@DavidC.Rankin,因为OP对
的使用很弱,而(!feof(BLZ1)){
,在
%d;%49[^\n]“
之后有一个空格,可以在下一个
feof()
上使用文件结束标志。最好使用
fscanf()
返回值。最好使用
fgets()
@chux——但如果非POSIX行在输入的最后一行结束,这难道不会让他面临输入失败吗?啊,空白就是零或更多的空白。
// 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);
  }
}