我正在做作业,并且遇到一些问题。
我需要读取一个包含数字和字符串的文件,并将值存储在数组中。
我正在读取的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;
}
有人有什么建议吗?
任何帮助将不胜感激。
答案 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 ,然后对其进行解析。应付格式错误的输入要容易得多。