我正在输入一个文件(input.txt)到我的程序中 input.txt包含以下文字:
Trojans, 0.80, 0.60
Bruins, 0.20, 0.30
Bears, 0.60, 0.50
Trees, 0.50, 0.40
Ducks, 0.40, 0.80
Beavers, 0.50, 0.10
Huskies, 0.80, 0.40
Cougars, 0.10, 0.90
但终端输出的是
Trojans, 0.80, 0.60
Bruins, 0.20, 0.30
Bears, 0.60, 0.50
Trees, 0.50, 0.40
Ducks, 0.40, 0.80
Beavers, 0.50, 0.10
Huskies, 0.80, 0.40
Cougars, 0.10, 0.90�
我不确定这个奇怪的问号来自哪里。
我的代码目前是
知道为什么会这样吗?
答案 0 :(得分:0)
最后一个字符是一些垃圾值。因为即使它处于EOF,il也会在while循环中递增。以下更改应该可以解决问题。检查条件的变化为nee< (il -1)
for (int nee = 0; nee < (il - 1); nee++) //check to see if what i outputted is correct
{
cout << team[nee];
}
检查下面修改过的readfile例程:
void readfile()
{
char temp;
ifstream myfile ("input.txt");
int il = 0;
while (!myfile.eof())
{
temp = myfile.get();
team[il] = temp;
il++;
}
for (int nee = 0; nee < il - 1; nee++) //check to see if what i outputted is correct
{
cout << team[nee];
}
cout << endl ;
}
答案 1 :(得分:0)
eof()告诉您是否尝试读取文件的结尾,因此循环不正确。它应该是:
for (;;)
{
temp = myfile.get();
if (myfile.eof()) break;
team[il] = temp;
il++;
}
答案 2 :(得分:0)
myfile.eof()
将在第一次失败后返回
temp = myfile.get();
team[il] = temp;
il++;
你读了myfile.get()
的字节,将在文件末尾失败,但你没有检查你是否成功读取了文件中的字节。解决此问题的最简单方法是在 myfile.get()
之后但在对结果执行任何操作之前插入检查。
temp = myfile.get();
if(!myfile) // use implicit conversion from stream to bool to test for success
break;
team[il] = temp;
il++;
这不是一个特别优雅的循环结构,但我个人会使用这样的东西:
for(char temp=myfile.get();
myfile && il < sizeof(team)/sizeof(team[0]);
temp=myfile.get(), ++il)
{
team[il] = temp;
}
这将起作用,因为循环条件(myfile
)将在每次获取后检查,但在执行循环体(team[il] = temp;
)之前,因此没有写入的危险team
无效字符。
请注意,如果myfile的长度超过80个字节,则代码中包含潜在的缓冲区溢出,我在上面的循环中添加了一个条件,确保例程将在文件末尾停止读取或80字节 - 以哪个为准首先发生。