2012-03-15 11 views
1

getline関数に問題があり、charctersでエラーが発生すると思います。不要な行為を引き起こすC++のifstreamを取得しますか?

私は取得していますエラーは次のとおりです。

エラー1つのエラーLNK2019:???未解決の外部シンボル"public: void __thiscall ArrayStorage::read(class std::basic_ifstream<char,struct std::char_traits<char> > &)"(Dする@ STD @ ArrayStorage @@ QAEXAAV $ basic_ifstream @ DU $ char_traitsを読ん@@@ std @@@ Z)関数_mainで参照されるC:\ Users \ Lewis \ SVN \ project1 \ main.obj

何か考えてください。誰かがこのタイプの配列を使ってこの仕事をするより効果的な方法を持っているなら、私は与えられた助言を引き受けるでしょう。

+1

これはコンパイラエラーではなくリンカエラーです。とにかく、あなたの行の読み方のイディオムは間違っています(あなたはEOFを使用してはいけません)が、文字通り何百万という疑問があります。 –

+3

'!fin.eof()'は 'getline'が成功することを保証しません。 (これは確かにリンカエラーの原因ではありませんが) –

+0

'getline'はどのような点でこの問題に関係していると思いますか?それは前に動作しましたが、一度その行を追加するだけで失敗し始めますか?私の推測では、 'getline'の仕組みが分からず、問題にぶつかったので、エラーメッセージを慎重に読むのではなく、それが実際に不平を言っているのを見るのではなく、 。 –

答えて

2

Array::read()関数の定義を提供していません。 read()という名前の新しい関数を宣言していますが、Arrayクラスとは関係ありません。コンパイラとリンカは、ファイルがArray.cppであることに気にしません。

は、代わりにこれを試してみてください:

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

私がリコールした場合、このリンカエラーは時々あなたのクラスまたは定義されていない仮想関数を持つその拠点の一つに起因することができます。 MSVCコンパイラは、定義された仮想関数を持つ最初のCPPファイルがクラスヘッダー定義関数の定義をスティックするのを待つため、実際に定義が欠落している仮想関数ではなく、指定された関数でエラーが発生します。そのようなCPPファイルが見つからないときは、class-header-defined関数を決して定義しません。この点でGCCはMSVCとは異なる動作をします。私は、GCCが彼らが使用しているすべてのオブジェクトファイルに定義を固執し、リンク時にエキストラを捨てると信じています。 MSVCはそれを一度だけ定義しているため、決してそれを決して定義しないことがあります。定義を挿入するのを「忘れている」ということを「ちょうど知る」ことができない理由は、いつでもコンパイラを少しずつ呼び出すことができるためです。 。

3

何とか何とか何とか未解決の外部シンボル"public: void __thiscallArrayStorage ::これは、リンカエラーです(class std::basic_ifstream<char,struct std::char_traits<char> > &)"何とか何とか何とか

をお読みください。つまり、関数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 
+0

応答。なんらかの理由で、文字列のリストの終わりには達しませんが、途中で停止します。これには何らかの理由がありますか(私のコードをあなたが私に与えたものに更新しました)もう一度ありがとうございます。 – rx432

関連する問題