#include "keywords.h"
#include <iostream>
#include <fstream>
#include "llist.h"
#include <string>
using namespace std;
//default constructor
List<string> L;
keywords::keywords(){
}
void keywords::open_file(string filename)
{
input.open(filename.c_str());
}
void keywords::close_file(){
input.close();
}
void keywords::load()
{
string t;
while(input)
{
getline(input,t);//error line
L.insert_ordered(t);
L++;
}
L.print(cout);
}
bool keywords::find(std::string token)
{
L.start();
if(L.find(token)==1)
return 1;
else return 0;
}
4 に答える
getline()
実際に行が正常に読み取られたかどうかは確認しません。ループは次の戻り値をチェックする必要がありますgetline()
。
while(getline(input,t)) {
L.insert_ordered(t);
L++;
}
void keywords::load()
{
string t;
while(input)
{
getline(input,t);//error line
L.insert_ordered(t);
L++;
}
L.print(cout);
}
ここに重要な行があります:
while(input)
これは実際には次のように変換されます。
while(!input.fail())
http://www.cppreference.com/wiki/io/eofにある ifstream::fail() のドキュメントを参照してください。ifstream::fail() (および eof()) がどのように機能するかを説明します。あなたの場合、 input.fail() は、ファイルからの読み取りを試みた直後にチェックする必要がありますが、読み取り値を使用する前にチェックする必要があります。
つまり、getline(..) の直後で、L.insert_ordered(...) の前に確認する必要があります。
これを試して -
void keywords::load()
{
string t;
while(true)
{
getline(input,t);
if (!input)
break;
L.insert_ordered(t);
L++;
}
L.print(cout);
}
これを行う別の方法を次に示します。
void keywords::load()
{
string t;
getline(input,t);
while(input)
{
L.insert_ordered(t);
L++;
getline(input,t);
}
L.print(cout);
}
私はこれらをコンパイルして実行しようとはしていないので、自分で解決したいと思うかもしれませんが、一般的な考え方を理解していただければ幸いです。プログラムの残りの部分が正常に機能するかどうかはわかりませんが (コード内の L++ の目的については少しわかりません)、ifstream::fail() の使用方法 (または暗黙的にストリームを直接テストすることによって)役立ちます。
おそらくこれは Unicode ファイルであり、ファイルの先頭にバイト オーダー フラグ バイトが表示されています。
奇妙な振る舞い。これは実際にコンパイルされていますか?いくつかの出力で説明できますか? 私が尋ねている理由は、私の知る限り、
getline
実際には次のように定義されているためです
istream& getline (char* s, streamsize n );
。