我错误地使用了fscanf吗?

时间:2014-05-28 13:24:05

标签: c++ c text scanf

我从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读成一个字符串。

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

谢谢:)

3 个答案:

答案 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)。现在我只是没时间修理它。

谢谢大家的帮助:)。