在c ++ ifstream中的Getline会导致不必要的行为?

时间:2012-03-15 21:53:20

标签: c++ arrays getline

我认为我的getline函数存在问题,因为我对charcters有错误。

我得到的错误是:

  

错误1错误LNK2019:函数_main C中引用的未解析外部符号"public: void __thiscall ArrayStorage::read(class std::basic_ifstream<char,struct std::char_traits<char> > &)"(读取@ ArrayStorage @@ QAEXAAV?$ basic_ifstream @ DU?$ char_traits @ D @ std @@@ std @@@ Z) :\用户\路易斯\ SVN \ PROJECT1 \ main.obj

任何想法都将不胜感激。如果有人使用这种类型的数组有更有效的方法来完成这项任务,我会接受任何建议。

3 个答案:

答案 0 :(得分:3)

  

blah blah blah 未解析的外部符号"public: void __thiscall ArrayStorage :: read (class std::basic_ifstream<char,struct std::char_traits<char> > &)" blah blah blah

这是链接器错误。这意味着缺少函数ArrayStorage::read的定义。为什么?因为代码具有名为read的函数的定义,而不是ArrayStorage::read。如果您定义ArrayStorage::read

,应该会找到它
//Array cpp:
void ArrayStorage::read(ifstream& fin)
// ...

一旦超过该程序,该程序可能会运行。而且你可能会因为读取循环而发现错误。 while (! fin.eof() )在文件不在最后时“不运行”。它运行时,前一个读操作没有尝试读取结束。考虑一下检查时必须发生的事情:

while (! fin.eof() ) // in the last iteration the read didn't go beyond the end of the file
{                    // so one more iteration is ran
    getline (fin,line); // tries to read past the end, fails

    if (line == "") continue; // line is unchanged, so it could be a non-blank line from before

    myArray[arrayIndex]=line; // Saves that line in the array:
                              // even though no line was read
    arrayIndex++;
} // goes back to the start of the loop, and only now !fin.eof() fails
  // but it's too late, the damage has been done

你可能不希望这种情况发生。你想在阅读失败后立即停止阅读。这很简单:只需将阅读作为条件:

while (getline (fin,line)) // if reading a line fails, the loop is not entered
{                          // and so no extra line is added to the array

答案 1 :(得分:2)

您没有提供Array::read()功能的定义。您声明了一个名为read()的新函数,但它与Array类无关。编译器和链接器并不关心它位于名为Array.cpp的文件中。

请改为尝试:

void Array::read(ifstream& fin)
{
    //...
}

答案 2 :(得分:-1)

如果我记得,这个链接器错误有时可能来自您的类或其基础之一其他虚拟函数未定义。错误发生在名为的函数上,而不是实际上缺少定义的虚函数,因为MSVC编译器一直等到它找到第一个带有已定义的虚函数的CPP文件,以便类保持类头定义函数的定义。 ,当它没有找到这样的CPP文件时,它永远不会定义类头定义的函数。在这方面,海湾合作委员会的行为与MSVC不同;我相信GCC会将定义粘贴在他们使用的每个目标文件中,并在链接时丢弃额外的内容。 MSVC只定义了一次,因此无意中定义它。它不能“只知道”它“忘记”插入定义的原因是因为编译器可以随时以增量方式调用,一次只能调用某些文件,因此它不具备全局