【问题标题】:getting variables from txt file从txt文件中获取变量
【发布时间】:2014-05-09 09:11:36
【问题描述】:

我有一点代码问题..有人知道可能出了什么问题吗?

我的代码:

FILE *tiedosto;
char tiedostonimi[] = "input.txt";
tiedosto = fopen (tiedostonimi, "r");
char luokka, kaupunki[4];
int kuutio, vuosi, kuukausi, paiva;

fscanf(tiedosto, "%i&energialuokka=%c&kaupunki=%s&Vuosi=%i&Kuukausi=%i&pva=%i", &kuutio, &luokka, &kaupunki, &vuosi, &kuukausi, &paiva);
printf("%d %c %s %d %d %d , kuutio, luokka, kaupunki, vuosi, kuukausi, paiva);

txt 文件中的一行:

22&energialuokka=A&kaupunki=ei&Vuosi=2010&Kuukausi=02&pva=22

(“22”“A”“ei”“2010”“02”“22”不是永久值。通过网站形式给出并保存到文本文件中)

当前

输出是:

22 u ei&Vuosi=2010&Kuukausi=02&pva=22 831192666 0 -163754450

【问题讨论】:

  • 那么预期的输出是什么?你想要的输出是什么?
  • 我希望它只打印通过表单给出的那些值。我的意思是 22 A ei 2010 02 22 在这种情况下
  • 爱读,爱听,虽然我一个字都不懂... :-)
  • 试试fscanf(tiedosto, "%i&energialuokka=%c&kaupunki=%3[^&]&Vuosi=%i&Kuukausi=%i&pva=%i", &kuutio, &luokka, kaupunki, &vuosi, &kuukausi, &paiva);
  • 啊,谢谢.. 我已经用 strtok 修复了它,但这个似乎也可以工作:)

标签: c file variables output


【解决方案1】:

问题在于,当扫描字符串时,scanf 系列函数将扫描到一个空格(或文件结尾,以先发生者为准)。扫描字符串时不能真正使用模式匹配。您可以通过检查fscanf 的返回值来非常简单地验证这一点,在您的情况下,它应该是3(因为它扫描整数、一个字符,然后将其余部分作为单个字符串进行扫描)。

顺便说一句,这当然会导致undefined behavior,因为您会以相当大的幅度覆盖为字符串分配的数组,并打印未初始化的局部变量的值。

相反,最好对输入进行标记(提示:请参阅strtok 函数),首先将其拆分为 & 符号 '&',然后除第一个值外,然后在相等字符 '=' 上拆分另一个值.然后检查每个“键”以了解要设置的值。

【讨论】:

    【解决方案2】:

    在 C-“字符串”中扫描时,不要使用地址运算符 (&)。

    所以这一行:

    fscanf(tiedosto, "%i&energialuokka=%c&kaupunki=%s&Vuosi=%i&Kuukausi=%i&pva=%i", &kuutio, &luokka, &kaupunki, &vuosi, &kuukausi, &paiva);
    

    应该是这样的:

    fscanf(tiedosto, "%i&energialuokka=%c&kaupunki=%s&Vuosi=%i&Kuukausi=%i&pva=%i", &kuutio, &luokka, kaupunki, &vuosi, &kuukausi, &paiva);
    

    背景是,如果使用不带索引运算符的数组变量,它(已经)衰减到指向其第一个元素(地址)的指针。

    【讨论】:

    • 在这种情况下并不重要,因为kaupunki 是一个数组。不过还是不错的建议。
    • Huuh .. dxxn 你是对的!男人根本不是为了一次感知超过一级的间接性......@JoachimPileborg
    猜你喜欢
    • 1970-01-01
    • 2023-02-22
    • 1970-01-01
    • 1970-01-01
    • 2020-02-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多