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