C++ 我是否错误地使用了fscanf?

C++ 我是否错误地使用了fscanf?,c++,c,text,scanf,C++,C,Text,Scanf,我在读取文本文件时遇到了一个小问题 我有一小段代码(C++): 它只使用toode[i].nimi一个接一个地读取单词(和数字),因此结果是: Toode: product1 Kogus: 0 Hind: 0.0000 Toode: 4 Kogus: 0 Hind: 0.0000 等等 还要注意,product1可以是两个单词,但它们之间用空格分隔,而不是制表符。我希望它将product1作为一个字符串读取 (在询问之前,我尝试查找它,但找不到解决方案。如果是重新发布,则很抱歉。) 谢谢:)

我在读取文本文件时遇到了一个小问题

我有一小段代码(C++):

它只使用
toode[i].nimi一个接一个地读取单词(和数字),因此结果是:

Toode: product1
Kogus: 0
Hind: 0.0000

Toode: 4
Kogus: 0
Hind: 0.0000
等等

还要注意,
product1
可以是两个单词,但它们之间用空格分隔,而不是制表符。我希望它将
product1
作为一个字符串读取

(在询问之前,我尝试查找它,但找不到解决方案。如果是重新发布,则很抱歉。)


谢谢:)

是的。你用错了

所有参数都必须是指针,您为char[]提供了指针,但没有为int和float提供指针

指针是在C中创建out(而不是返回)参数的唯一方法。格式后面的所有参数都是out参数

它应该是:(注意添加的“&”项)

编辑我还修复了格式

fscanf(kala, "%[^\t] %i %f", toode[i].nimi, &toode[i].kogus, &toode[i].hind);
格式字符串中的
“[^”
将尝试匹配输入中的文本
[^
(可能会失败),因为前面没有
%
,所以它不是scanf模式。您可能只需要:

fscanf(kala, " %[^\t]%i%f", toode[i].nimi, &toode[i].kogus, &toode[i].hind);

您还有许多其他问题,例如,没有进行任何错误检查,但这至少应该让您开始。

好的,所以我对它进行了一些修补,发现(仍在学习)我从中获取信息的文本文件中不应该有comas。或者至少我应该让
fscanf
忽略comas

我还删除了
[^\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,你是对的,我可以做得更好,以消除未来的bug。感谢大家的提醒(不确定是否正确使用此表达式:p)。现在我只是没有时间修复它


“谢谢”,“谢谢”,“< /p> >代码> int())/Cuth>是整个问题中唯一的C++。如果你要写C++,你应该写C++。换句话说,<代码> STD::String ,代码> STD::矢量< /代码>,代码> IoSturis,等等。注意:1)错误使用<代码> FEF(KARA)。
result。2)使用
fgets(缓冲区,200,卡拉)
在循环之前。甚至比这更好的是先放弃整个循环line@crasstr我相信您可以选择以自己的风格编写代码。感谢您的澄清!修复了我的代码。但它仍然没有解决主要问题。仍然没有将数据扫描到“&toode[I].kogus”和“&toode[I].hind.您还应该测试fscanf的结果,以控制实际读取的参数数量。我找到了一个解决方案和主要问题。在文本文件中我有comas。这是一个很大的错误。感谢大家的帮助:)我会尽快发布较长的答案(因为我的声誉还不到10,所以不能再发布8小时)
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