0

私の問題は、C++ アプリケーションで Windows 形式のテキスト ファイルを開くときと同じように、Linux 形式のテキスト ファイルを読み込んで定期的に読み込もうとしていることです。ファイルがWindowsで希望どおりにフォーマットされ、ファイルのデータがリストのリストにロードされると、完全に機能するようになりました。

私の問題をもう少しうまく説明しようとすると、現在できることは、タブ区切りのファイルがある場合、各行のすべての内容を文字列のリストに格納でき、各文字列が何であれ各タブが分かれています。次に、すべての行のリストがあります。

たとえば、私のテキスト ファイルは次のように表示されます。

156   Hit   83.2   23:34
23    Miss  21.4   23:38

等々....

以下のこのコード スピネットは、私が使用しているもので、他の場所でヘルプを見つけて、必要な方法で動作するように変更しました。リスト内に 2 つの項目を持つリストが作成されます。各項目には、現在の行の各「列」の内容を表す 4 つの文字列のリストが含まれます。これが十分に説明されていることを願っています。

    ifstream infile(file);
list <list <string> > data;
while (infile){
    string s;
    if (!getline( infile, s )) break;

        std::istringstream ss ( s );
        list <string> record;

    while (ss){
        string s;
        if (!getline( ss, s, '\t' )) break;
            record.push_back( s );
    }
    data.push_back( record );
}

それはまさに私がやりたいことですが、Windowsテキストファイルとしてフォーマットされてから読み取られるテキストファイルの代わりに、Linuxテキストファイルになり、各行の各「アイテム」の間にタブがありません; 代わりに、ランダムな数のスペースが含まれます。私の考えでは、ファイルをバイナリ モードで開いてそのように読み取ることができ、タブを区切り文字にする代わりに、任意の量の空白を選択できました。ただし、私はまだC++に比較的慣れておらず、Windows C++アプリケーションからLinux形式のテキストファイルを読み取ることに特に取り組んでいないため、その方法が正確にはわかりません。どんな助けでも大歓迎です。前もって感謝します!

4

1 に答える 1

2

これは、Linux と Windows とは関係ありません。>>空白で区切られたフィールドのフォーマットされた入力を実行するために使用できます。

string s;
while (ss >> s)
    record.push_back(s);

空白を明示的にスキップするには、std::ws;を使用します。空白のスキップを無効にするには、 を使用しますstd::noskipws

于 2013-08-14T20:29:59.687 に答える