【发布时间】:2014-05-26 19:57:39
【问题描述】:
我正在尝试从文件中读取信息,但我的代码不会读取每一行中的第一个输入。
这是我的代码:
#include <cstdio>
#include <cstdlib>
#include <iostream>
using namespace std;
int main()
{
FILE* inFile;
long long int time;
char state, ID[12], name[51];
inFile = fopen("file.i2", "r");
while (fscanf(inFile, "%i %s %s %[^\n]s",&time ,&state, &ID, &name)!=EOF)
cout << time << ' ' << state << ' ' << ID << ' ' << name << endl;
return 0;
}
这是输入:
1111 A 01010112345 SomeString1
1112 A 01010154321 SomeString2
1113 A 11111122222 SomeString3
1114 B 12121233333 SomeString4
1115 B 12121233333 SomeString5
这是输出:
1024 A 01010112345 SomeString1
1024 A 01010154321 SomeString2
1024 A 11111122222 SomeString3
1024 B 12121233333 SomeString4
1024 B 12121233333 SomeString5
在我的情况下,输出应该与输入相同。
【问题讨论】:
-
%s将写入一个以 null 结尾的字符串,从而导致未定义的行为,因为您没有提供足够的存储空间。 -
您可能不想开始对您传递的类型撒谎:
%i用于int,而不是long long int。如果你想阅读long long int,你会使用lli。由于您将此问题标记为 C++,因此我建议使用std::ifstream,因为它会自动计算出必要的转换。此外,您应该检查4而不是EOF:只有当流甚至无法读取一个元素时才会返回常量EOF。 -
@DietmarKühl 我将 %i 切换为 %lli 并将 while 条件更改为 '... == 4',但程序仍然返回时间为 1024。
-
@KerrekSB 你能解释一下我没有提供足够的存储空间吗?
-
@user3677314 这应该是字符状态[2],'A' + '\0' 是2个字符,你为什么不看下面的答案?