2

C++ファイルストリームを使用してテキストファイルを解析するときに奇妙な問題が発生しました。コードは次のとおりです。

while (true)
{       
    std::getline(inFile, line);
    if (!inFile.good())
    {
        std::cout << "Fail, bad and eof flags:" << inFile.fail() << inFile.bad() << inFile.eof() << std::endl;
        break;
    }
    parseLine(line);        
}   

読み取りが終了すると、出力は次のようになります。

Fail, bad and eof flags:001

しかし、実際には、リーダーはファイルの終わりに到達しません。ファイルを開くと、次の文字が実際には26(ASCIIコード)であることがわかります。次に、問題は次のとおりです。1)この文字を読み取るときにeofフラグが設定される理由と、この種の誤った終了を回避する方法は?および2)この状態から回復する方法は?ありがとう!

PS:返信に感謝します。バイナリモードでファイルを読み取った場合はどうなりますか?より良い解決策はありますか?Windowsプラットフォームを使用していますが、ファイルはUNIXファイルのようです。

4

3 に答える 3

3

この文字を読み取るときにeofフラグが設定される理由

EOFマーカー文字だからです。

ウィキペディアから:

MicrosoftのDOSおよびWindows(およびCP / Mおよび多くのDECオペレーティングシステム)では、端末からの読み取りでEOFが生成されることはありません。代わりに、プログラムはソースが端末(または他の「文字デバイス」)であることを認識し、指定された予約文字またはシーケンスをファイルの終わりの標識として解釈します。最も一般的には、これはASCII Control-Z、コード26です。


この種の誤った終了を回避する方法

これは「誤った」終了ではありません。


この状態から回復する方法は?

あなたはする必要はありません。

任意の文字が予想される「バイナリファイル」を読み込もうとした場合は、ファイルストリームをバイナリモードで開きます。

于 2013-01-31T03:31:15.623 に答える
2

ASCII文字26はSUB制御文字であり、キャレット記法では。です^Z。これは、Windowsのファイルの終わり文字として認識できる場合があります。したがって、ASCIIとWindowsを想定すると、そこに行きます。

于 2013-01-31T03:21:39.583 に答える
2

どうぞ:

Getlineと16h(26d)文字

独自のgetline関数を作成する必要があるようです。それを回避する方法はないようです:p私が知っていること、そして他の誰も知らないようです。誰かがより良い方法を知っているなら、チャイムを鳴らしてください。

于 2013-01-31T03:24:24.433 に答える