6

コードは次のとおりです。

  std::ofstream f("file1.txt");
  f<<"123"<<std::endl<<"456";           //(*1)

  /*std::stringstream ordinary_strstream; This works too
  ordinary_strstream<<"123"<<'\n'<<"456";
  f<<ordinary_strstream.str();*/

  std::wstringstream s;
  s<<L"123"<<std::endl<<L"456";         //(*2)
  s<<L"123"<<L"\n"<<L"456";             //(*3) 
  s<<"123"<<WCHAR(13)<<WCHAR(10)<<"456";//(*4)

  HANDLE h =CreateFileW(L"file2.txt", GENERIC_WRITE, FILE_SHARE_READ | FILE_SHARE_WRITE,
    NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL);

  ULONG l;
  WriteFile(h, s.str().c_str(), s.str().length() * 2, &l, NULL);

(*1) の場合は改行がありますが、(*2) と (*3) の場合は file2.txt に改行がありません。(*3)の中には改行があります。notepad.exeブラウジングに使っています。16 進エディタには0x0Dバイトは表示されず、0x0A.

改行をユニコードテキストファイルに正しく配置するにはどうすればよいですか? ありがとうございました。

4

2 に答える 2

11

それは予想されることです:ワイド文字ストリームにをstd::endl書き込みL'\n'ます(そしてそれをフラッシュしますが、ここでは関係ありません)、決してL"\r\n"。リテラルを書くとき、それはさらに明白L"\n"です。WriteFileいかなる種類の改行置換も実行しませんwstringstream(ファイルストリームはテキストモードで開いたときに改行置換を実行することに注意してくださいそのため、で適切な改行を取得します(*1))。したがって、ファイルにはキャリッジリターン文字はありません。必要に応じて、明示的に記述してください。

于 2012-04-28T12:46:11.323 に答える
4

文字列ストリームは行末変換を行いません。(コンテキストに応じて、char または wchar)std::endlとまったく同じです。\n

CreateFile行末変換を行いません。それは厳密にバイナリです。

したがって、stringstream で文字列を作成し、それを でファイルに書き込むとCreateFileendlは単なる改行 ( 0x0A) 文字になります。

メモ帳は、行末が CR+LF ではなく改行だけのファイルにはうまく対応できません。

于 2012-04-28T13:01:23.683 に答える