我想读取文本文件并存储在数组中然后显示。
这是我的代码:
int i = 0, line = 5;
char ch[100];
FILE *myfile;
myfile = fopen("test.txt","r");
if (myfile== NULL)
{
printf("can not open file \n");
return 1;
}
while(line--){
fscanf(myfile,"%s",&ch[i]);
i++;
printf("\n%s", &ch[i]);
}
fclose(myfile);
return 0;
}
这是我的文字:
测试123562
856
59986
但结果:
EST
2356
56
9986
有什么问题? :(
答案 0 :(得分:5)
ch[i]
持有一个字符。语句fscanf(myfile,"%s",&ch[i]);
会将字符串扫描到只能容纳一个字符的ch[i]
。 '\0'
无法将您的计划引向未定义的行为。
更改
fscanf(myfile,"%s",&ch[i]);
到
fscanf(myfile,"%s",ch);
以前的回答是错误的。程序的行为已明确定义,但您正在以错误的方式扫描文件。如果您在i++;
声明之后放置printf
,您的程序将按预期工作。
while(line--){
fscanf(myfile,"%s",&ch[i]);
printf("\n%s", &ch[i]);
i++;
}
原因是&ch[i]
是指向数组的i th 元素的指针,字符串将存储在从位置i
开始的数组中。对于给定的输入,这将起作用,因为给定的数组足够大以容纳字符串。
您可以这样做:
while(line--){
fscanf(myfile,"%s",ch);
printf("\n%s", ch);
i++;
}
但每次扫描字符串时它都会覆盖数组ch
。最好使用二维数组来存储字符串并使用fgets
读取文件。
答案 1 :(得分:2)
您将无法在单个char ch[100]
数组中插入五行;这只是一个100个字符的数组。
你可以使它成为一个数组数组,即char ln[5][100]
,它将为你提供五行,每行100个字符的空间。
然后你当然需要在循环中索引该数组,即:
for(int i = 0; i < 5; ++i)
{
if(fgets(ln[i], sizeof ln[i], myfile) == NULL)
{
fprintf(stderr, "Read error on line %d\n", i);
exit(1);
}
}
这使用fgets()
很多更适合阅读整行; fscanf()
将停留在%s
的空白区域,这很少是您想要的。
答案 2 :(得分:1)
获取字符串时无需在scanf中使用&符号。把它变成这样。
fscanf(myfile,"%s",&ch[i]);
到
fscanf(myfile,"%s",ch);
&ch[i]
它将获得该数组中第i个位置的字符。如果您希望这样,可以使用%c
代替%s
。并将此更改为。
printf("\n%s", ch);
使用&符号时打印字符串,该&符号将访问该变量的地址。
答案 3 :(得分:-1)