12

テキスト ファイルの行ごとに操作を実行しようとしていますが、現在の方法では、このプロジェクトに必要な行ごとにifstreamオブジェクトが文字を検出していません。\nこれが私が今それを持っている方法です:

std::ifstream instream;
instream >> value;
while (value != '\n')
{
    // do code and such
}

しかし、ループを実行すると、取得できるのはプログラム内のすべての 1 行だけです。ループ内で想定されていることを正確に実行している間、\n認識される必要があります。これが私の.txtファイルです:

LXXXVII
cCxiX
MCCCLIV
CXXXLL
MMDCLXXIII
DXLCC
MCdLxxvI
XZ
X
IV

まさにその通り。変更できません。

4

3 に答える 3

23

この>>演算子は、(とりわけ) 空白をスキップすることを意味する「書式付き入力操作」を実行します。

空白をスキップせずに生の文字を 1 つずつ読み取るには、「フォーマットされていない入力操作」などを使用する必要がありますistream::get()valueがタイプであると仮定するとchar、各文字を次のように読み取ることができますinstream.get(value)

EOF に達すると読み取りが失敗するため、次のようなループ内のすべての文字を読み取ることができます。

while (instream.get(value))
  // process value

ただし、行ごとに読み取るには、 a に読み取ってstd::string使用できますstd::getline

std::string line;
while (getline(instream, line))
  // ...

これは、a までのすべてを\n文字列に読み込み、その文字を破棄するフォーマットされていない入力操作です (そのため、元の入力を再構築するには、各消去行の後\nに手動で a を追加する必要があります)。\n

于 2013-03-29T16:05:00.413 に答える
3

次のようにファイルを読み取ることができます。

 ifstream instream("file.txt);
 string line;
 while (instream >> line)
 {
    cout << line;
    if (instream.peek() == '\n') //detect "\n"
    {
       cout <<endl;
    }
 }
 instream.close();

このようにして、ファイル内の行が終了する場所を追跡し、ファイルの終わりを検出できます。

于 2013-03-29T16:09:34.980 に答える