我正在尝试使用下面的格式读取.txt,以便创建一个大小为26的数组(字母表中每个字母1个)。
a 5
b 2
c 4
d 10
e 11
f 5
g 7
...
我尝试使用下面的(非工作)代码执行此操作,发送空的vec [26]作为参数,以及包含每个单词的值的.txt:
void readvalues(FILE*values, int*vec)
{
if (values == NULL)
{
printf("Couldn't open values' file\n");
exit(0);
}
int i=0;
while (i<26)
{
fscanf(values,"%d",&vec[i]);
printf("%d\n",vec[i]);
i++;
}
}
当我检查printf输出时,我看到vec [0]是正确的,但是此功能开始在剩余位置上存储垃圾。 造成这种情况的原因是什么?如何解决?除了fgets之外还有替代fscanf吗?
提前谢谢。
答案 0 :(得分:1)
即使您不打算使用文件中的字母字符,仍然需要添加代码来读取字符。否则,尝试读取数字将被卡在下一个字母。
char ch;
// ....
fscanf(values,"%c %d", &ch, &vec[i]);
答案 1 :(得分:1)
这可以帮到你:
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
void readvalues(FILE *values);
FILE *datafile;
int vec[26];
int main()
{
datafile = fopen ( "my.txt", "r");
readvalues(datafile);
return 0;
}
void readvalues(FILE *values)
{
char tmp[2];
if (values == NULL)
{
printf("Couldn't open values' file\n");
exit(0);
}
int i=0;
while (i<26)
{
if(fscanf(values,"%s %d",tmp,&vec[i]));
printf("%d\n",vec[i]);
i++;
}
}
答案 2 :(得分:0)
而是使用固定值26进行循环,您可能需要逐行考虑循环,直到文件中的数据消失为止:
int getdata(FILE *ifp, int *data){
char buf[256]; // potential size of leading string
int i=0; // offset into data array
while (fscanf(ifp, "%s %d", buf, &data[i]) != EOF) {
i++;
}
return i; // return how many ints were read and processed
}
然后你的文件可以有2行或200万行。您只需要确保data
足够大 - 通过使用动态内存或预先排除文件中的行。