0

現在のコード:

void LinkedList::readFunct( string file ) {
string word;
string trailing_char;
stringstream ss;

ifstream infile ( file.c_str() );
while ( getline( infile, word)) {
    cout << "The line is " << word << endl;
    ss << word;
    while ( getline ( ss, word, ' ' )) {
        trailing_char = "space";
        cout << "Word: " << word << endl << "Trail: "<< trailing_char << endl;
    }
    ss.str( string() );
    ss.clear();
}
}

このコードは、テキスト ファイル (その名前が渡される) から取得し、それを読み、単語 (スペースまたは改行文字で区切られている) を見つけ、末尾の文字 (前述のスペースまたは改行)

したがって、次のようなテキストファイル:

abc def ghi

jkl mno pqr

abc の後にスペース、ghi、pqr の後に新しい行が続く必要があります (実際にはそうではないことはわかっていますが、後で操作するためにすべてをリンクされたリストに割り当てているので、それが最後だったことを知る必要がありますライン)。

私はこのパズルを何時間も理解しようとしましたが、私は機知に富んでいます. ヘルプ?

4

3 に答える 3

2

std::getline(in, word)最初に、すべての改行を使い果たす文字列を読み取ります。最後の単語を使用するstd::getline(in, word, ' ')と、直後に何も続かない場合があります。つまり、行の境界にありました。改行とスペースの違いを確認する方法は、スペースがstd::getline()原因で内部が停止したか、文字列の最後に達したために停止したかを確認することです。

while (std::getline( infile, word)) {
    std::cout << "The line is '" << word << "'\n";
    ss.clear();
    ss.str(word);
    while (std::getline (ss, word, ' ' )) {
        trailing_char = ss.eof()? "newline": "space";
        cout << "Word: " << word << endl << "Trail: "<< trailing_char << '\n';
    }
}

やや簡単な方法は、ファイルを一度に 1 単語ずつ読み取り、単語に続く文字が存在するかどうか、スペース、または改行 (またはその他の空白文字の 1 つ) を出力することです。

for (std::string word; infile >> word; ) {
    switch (infile.peek()) {
    case '\n': trail = "newline"; break;
    case '\r': trail = "carriage-return"; break;
    case ' ': trail = "space"; break;
    case '\f\: trail = "form-feed"; break;
    // ...?
    default: trail = "end-of-file"; break;
    }
    std::cout << "word='" << word << "' trail=" << trail << '\n';
}
于 2013-09-20T21:37:01.850 に答える
1

まあ、getlineデフォルトでは改行で区切られているので、これで十分です。例:

std::ifstream infile("text.txt");

for (std::string line; std::getline(infile, line); )
{
    std::istringstream iss(line);
    bool firstword = true;
    for (std::string word; iss >> word; )
    {
        if (!firstword) { std::cout << "SPACE\n"; }
        std::cout << word;
        firstword = false;
    }
    std::cout << "NEWLINE\n";
}

ブール値フラグの複雑さは、単語よりもスペースが 1 つ少ないためです。

于 2013-09-20T21:29:36.463 に答える
0

私はあなたのコードを編集しました:

void LinkedList::readFunct( string file ) {
string word;
string trailing_char;
stringstream ss;

ifstream infile ( file.c_str() );
while ( getline( infile, word)) {
    cout << "The line is " << word << endl;
    ss << word;
    bool firsttime = true;
    while ( ss >> word ) {
        if (!firsttime)
             cout << "Trail: space" << endl;
        cout << "Word: " << word << endl;
        firsttime = false;
    }
    if (!firsttime)
         cout << "Trail: NEWLINE" << endl;
    else
         cout << "empty line." << endl;
    ss.str( string() );
    ss.clear();
}
}
于 2013-09-20T21:51:47.837 に答える