我从fscanf
读取文本文件时遇到一个小问题。
我有一小段代码(C ++):
struct tooted
{
char nimi[50];
int kogus;
float hind;
}toode[20];
int main()
{
FILE *kala;
kala = fopen("kala.txt", "r");
int i=0, n=0;
char buffer[200];
while(!feof(kala))
{
if(n<1)
{
fgets(buffer, 200, kala);
}
if(n>0)
{
fscanf(kala, "%s[^\t]%i[^\t]%f", toode[i].nimi, toode[i].kogus, toode[i].hind);
i++;
}
n++;
}
for(i=0; i<n-1; i++)
{
printf("Toode: %s\nKogus: %i\n Hind: %f\n\n", toode[i].nimi, toode[i].kogus, toode[i].hind);
}
return 0;
}
fgets(buffer, 200, kala);
只是从第二行开始fscanf
。
在文件kala.txt
中,我有3行用[tab]分隔。第一个单词是一个字符串,第二个单词是一个整数,第三个单词是一个浮点数,如下所示:
product1 (tab) 4 (tab) 1.4
product2 (tab) 3 (tab) 2.3
它仅使用toode[i].nimi
逐个读取单词(和数字),结果是:
Toode: product1
Kogus: 0
Hind: 0.0000
Toode: 4
Kogus: 0
Hind: 0.0000
等
另请注意,product1
可以是两个单词,但它们用空格而不是制表符分隔。我希望它将product1
读成一个字符串。
(我在询问之前尝试查找,但我无法找到解决方案。抱歉,如果它是重新发布的。)
谢谢:)
答案 0 :(得分:2)
是。你错误地使用它。
所有参数都必须是指针,你给了char []的指针,但没有指向int和float。
指针是在C中创建(不返回)参数的唯一方法,格式后的所有参数都是参数。
应该是:(注意&#39;&amp;&#39;添加内容)
编辑 我还修复了格式......
fscanf(kala, "%[^\t] %i %f", toode[i].nimi, &toode[i].kogus, &toode[i].hind);
答案 1 :(得分:2)
格式字符串中的"[^"
会尝试匹配输入中的文字[^
(可能会失败),因为之前没有%
,所以它不是scanf图案。你可能只想要:
fscanf(kala, " %[^\t]%i%f", toode[i].nimi, &toode[i].kogus, &toode[i].hind);
您还有许多其他问题,例如using feof,并且没有进行任何错误检查,但这至少应该让您入门。
答案 2 :(得分:0)
好吧所以我稍微修改了一下,发现(仍然在学习)我不应该在文本文件中找到comas来获取信息。或者至少我应该让fscanf
忽略昏迷。
我还删除了[^\t]
,因为fscanf
忽略了它们,就像它对空格一样。
我的代码现在:
struct tooted
{
char nimi[50];
int kogus;
float hind;
}toode[20];
int main()
{
FILE *kala;
kala = fopen("kala.txt", "r");
int i=0, n=0;
char buffer[200], *token;
fgets(buffer, 200, kala);
while(!feof(kala))
{
fscanf(kala, "%s %i %f", toode[i].nimi, &toode[i].kogus, &toode[i].hind);
printf("Toode: %s\nKogus: %i\n Hind: %2.2f\n\n", toode[i].nimi, toode[i].kogus, toode[i].hind);
i++;
}
return 0;
}
我的输出现在:
Toode: product1
Kogus: 1
Hind: 1.5
Toode: product2
Kogus: 2
Hind: 2.6
等
正如我想要的那样。
我知道我仍然没有错误检查,但这不是我试图修复的错误,至少现在还没有。 很抱歉没有指定我的文本文件,因为它可以帮助您发现问题。我不知道在那里寻找问题:)
我正确地调查了feof,你是对的,我可以做得更好,以消除未来的错误。感谢您的提升(不确定是否正确使用此表达式:P)。现在我只是没时间修理它。
谢谢大家的帮助:)。