1

このコードを使用して、ファイルから文字列を読み取ります。

pbuf = infile.rdbuf();
size = pbuf->pubseekoff(0, ios::end, ios::in);
pbuf->pubseekpos (0,ios::in);
buf = new char[size];
pbuf->sgetn(buf, size);
str.assign(buf, buf+size);

char* buffsgetnにはではなくが必要なのでchar*、一時変数のデータを読み取る必要がありstringます。
したがって、この時点で、実際の質問をする前に、空白文字を含む可能性のあるファイルから文字列を読み取るためのより良い方法を誰かが知っているかどうかを教えてください(eofまでループしないでください)。

ファイルの内容は次のとおりです。 新しい行の何とか何とか
何とか何とか何とか

しかし、私が得たのは、次のとおりです。新しい行の何とか
何とか
何とか何とか何とか= </ p>

コードをいじってみると、文字を追加するにつれて、奇妙な文字の数が増えることに気づきました\n。ファイルのサイズを取得しようとすると、各\n文字に2バイトのスペースが必要なようですが、文字列の場合は1バイトしかかからないため、文字列が奇妙に見えます。これを回避するにはどうすればよいですか?

4

2 に答える 2

2

Windowsでは、テキストファイルの行末の表現は2バイトです:0x0d、0x0a。テキストモードを使用してそのようなファイルから読み取る場合、これらの2バイトは1文字の「\n」に変換されます。バイナリモードを使用する場合、生のバイトを読み取っていますが、それらは変換されません。それらが必要ない場合は、自分で翻訳する必要があります。

于 2012-11-29T20:45:58.597 に答える
1

これは、標準ライブラリの実装により、標準のWindows行の末尾\r\nが標準のc++行の末尾に変わるため\nです。

@ipcが言うように、あなたはあなたが望むことをするためにこの答えを使うことができます。(注:コメントによると、その質問で受け入れられた回答は、実際にはそれを行うための最良の方法ではありません。)

または、次のように、ストリームをバイナリモードで開くことにより、行末の変換を無効にすることができます。

std::ifstream t(fileName, std::ios_base::in | std::ios_base::binary);
于 2012-11-29T20:45:34.500 に答える