我试图读取文本文件并使用C函数将其存储在数组中,但遇到指针困难:
要读取的文件格式为\ t:
France Baguette
中国大米
日本寿司
等
我的代码如下,但目前只显示文件中的最后一个条目:
void func(char *a[])
{
FILE *dic = fopen("dic.log", "r");
char *country = malloc(30);
char *food = malloc(30);
int i = 0;
while (fscanf(dic, "%s %s", country, food) == 2)
{
a[i] = country;
a[i+1] = food;
i+=2;
}
fclose(dic);
}
int main (int argc, char*argv)
{
char *b[6];
func(b);
printf("%s %s\n", b[0], b[1]);
printf("%s %s\n", b[2], b[3]);
return 1;
}
我希望函数能够填充数组' b'以下列方式:
B [法国,面包,中国,水稻,日本,寿司]
答案 0 :(得分:4)
每次阅读都需要malloc。目前,每次新读取时,您都会覆盖相同的内存(在开头时使用了malloced)。 试试这个:
while (fscanf(dic, "%s %s", country, food) == 2)
{
a[i] = country;
a[i+1] = food;
i+=2;
// Reassign so we can re-read
country = malloc(30);
food = malloc(30);
}
这不是一个非常优雅的解决方案,因为你需要在最后一次阅读后释放最后的mallocs - 但它证明了这一点!
答案 1 :(得分:0)
这是有发生的,因为您只将内存分配给country
和food
一次。
在while循环中使用malloc,它将分配两个内存来单独存储值。
您的代码有点像
void func(char *a[])
{
FILE *dic = fopen("dic.log", "r");
char *country;
char *food;
int i = 0;
while (!feof(dic))
{
country = (char*)malloc(30);
food = (char*)malloc(30);
fscanf(dic, "%s%s", country, food);
a[i] = country;
a[i+1] = food;
i+=2;
}
fclose(dic);
}
int main (int argc, char*argv)
{
char *b[6];
func(b);
printf("%s %s\n", b[0], b[1]);
printf("%s %s\n", b[2], b[3]);
return 1;
}