从文件输入中获取奇怪的符号

时间:2014-02-12 08:39:47

标签: c++ arrays file io

我正在输入一个文件(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�

我不确定这个奇怪的问号来自哪里。

我的代码目前是

知道为什么会这样吗?

3 个答案:

答案 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字节 - 以哪个为准首先发生。