【问题标题】:C++ eof() problem - never returns true?C++ eof() 问题 - 从不返回 true?
【发布时间】:2010-10-01 18:25:14
【问题描述】:

所以我正在尝试读取此文件。一切看起来应该可以工作,但是在运行时程序超时并停止工作,我必须关闭它。到底是怎么回事?我怀疑 oef() 测试永远不会返回 true,它会一直在文件中寻找更多内容。我没有在文本文件中拖动空行。我试过疯狂地调试这个。我找不到任何问题,但它仍然无法正常工作。

Pet** petArray;

ifstream textFile2;
textFile2.open("pets.txt");

int i = 0;
string temp;
int tmpNum = 0;

if (textFile2.is_open())
{
    while (!textFile2.eof())
    {

        getline(textFile2, temp);

        petArray = new Pet*[arraySize];

        if (temp == "Dogs" || temp == "Cats" || temp == "Iguanas" || temp == "Pigs")
        {
            if (temp == "Dogs") tmpNum = 0;
            if (temp == "Cats") tmpNum = 1;
            if (temp == "Iguanas") tmpNum = 2;
            if (temp == "Pigs") tmpNum = 3;
            temp == "";
        }
        else
        {
            if (tmpNum == 0)
            {
                petArray[i] = new Dog(temp);
                cout << "Dog " << temp << " added" << endl;
            }
            if (tmpNum == 1)
            {
                petArray[i] = new Cat(temp);
                cout << "Cat " << temp << " added" << endl;
            }
            if (tmpNum == 2)
            {
                petArray[i] = new Iguana(temp);
                cout << "Iguana " << temp << " added" << endl;
            }
            if (tmpNum == 3)
            {
                petArray[i] = new Pig(temp);
                cout << "Pig " << temp << " added" << endl;
            }
            arraySize++;
        }

        i++;
    }
}

这里是文本文件的格式:

Dogs
d1
d2
Cats
c1
c2
Iguanas
i1
i2
Pigs
p1
p2

有什么建议吗?

【问题讨论】:

    标签: c++ eof


    【解决方案1】:

    eof 您尝试读取某些内容但操作失败后返回 true。所以放在getline之后。

    编辑:试试这个代码:

    vector<Pet*> petArray;
    ifstream textFile2("pets.txt");
    
    string temp;
    int tmpNum = 0;
    
    while (getline(textFile2, temp))
    {
        if (temp == "Dogs") tmpNum = 0;
        else if (temp == "Cats") tmpNum = 1;
        else if (temp == "Iguanas") tmpNum = 2;
        else if (temp == "Pigs") tmpNum = 3;
        else
        {
            if (tmpNum == 0)
            {
                petArray.push_back(new Dog(temp));
                cout << "Dog " << temp << " added" << endl;
            }
            if (tmpNum == 1)
            {
                petArray.push_back(new Cat(temp));
                cout << "Cat " << temp << " added" << endl;
            }
            if (tmpNum == 2)
            {
                petArray.push_back(new Iguana(temp));
                cout << "Iguana " << temp << " added" << endl;
            }
            if (tmpNum == 3)
            {
                petArray.push_back(new Pig(temp));
                cout << "Pig " << temp << " added" << endl;
            }
        }
    }
    

    【讨论】:

    • 是的,我知道它可能无法解决问题,但没有足够的信息来分析。温度的定义?如果你在调试器中中断,它会在哪里停止?
    • 我可以改为:while(getline(textFile2, temp) 吗?另外:我添加了额外的缺失内容
    • 是的,你可以。顺便说一句,您的程序在我的计算机上停止。你是如何决定它永远不会从循环中返回的?
    • 不,我认为如果 getline(textFile2, temp) 没有得到任何东西,它会跳出 while 循环。我想我是错误的假设?另外:我在主帖中添加了文本文件的格式。
    • 因为你存储了新分配的元素,你需要写一个for(int i = 0; i &lt; (int)petarr.size(); i++) delete petarr[i];。 vector 本身使用的内存在超出范围时会自动释放。
    【解决方案2】:

    你的意思是它不工作?这是写的方式,这会比你预期的多读一行。

    这是因为,当读取最后一行时,getline 还没有命中eof,但是当尝试读取该行时,在最后一行之后,就会命中eof。所以,这可能是你的问题。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-02-08
      • 2011-08-11
      • 2020-02-23
      • 1970-01-01
      • 1970-01-01
      • 2011-09-04
      • 1970-01-01
      • 2017-05-02
      相关资源
      最近更新 更多