从文本文件中获取变量

时间:2014-05-09 09:11:37

标签: c file variables output

我的代码问题很少。有人知道可能出现什么问题吗?

我的代码:

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&# 34;不是永久价值..通过网站表格给出并保存到文本文件中)

当前

输出是:

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

2 个答案:

答案 0 :(得分:2)

用C - "字符串扫描"不要使用address-of运算符(&)。

所以这一行:

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);

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

答案 1 :(得分:2)

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

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

相反,可能更好地对输入进行标记化(提示:请参阅strtok函数),首先将其拆分为&符号'&',除了第一个值然后将另一个值拆分为相等字符'='。然后检查每个"键"知道要设置什么值。