2

std::getline() を使用して、テキスト ファイルから行ごとに読み取ります。ただし、getline への最初の呼び出しは、ファイル全体を読み取っています。また、区切り記号を「\ n」として明示的に指定しようとしました。なぜこれが起こっているのでしょうか?

私のコード:

std::ifstream serialIn;
...
serialIn.open(argv[3]);
...
std::string tmpStr;
std::getline(serialIn, tmpStr, '\n');
// All 570 lines in the file is in tmpStr!
...
std::string serialLine;
std::getline(serialIn, serialLine);
// serialLine == "" here

Visual Studio 2008 を使用しています。テキスト ファイルには 570 行あります (Notepad++ fwiw で表示しています)。

編集: Notepad++ を使用して入力テキスト ファイルの行末を "Windows" 行末に変換することで、この問題を回避しました。このファイルは、C++ コードを使用して、各行の末尾に「\n」を付けて記述されています。getline() が Windows の行末 (\r\n) を必要とするのはなぜですか?? これは、文字幅または Microsoft の実装と関係がありますか?

4

2 に答える 2

6

推測ですが、ファイルに Unix の行末が含まれていて、Windows で実行している可能性はありますか?

于 2012-08-28T03:16:18.517 に答える
3

コード ( ) に表示される改行'\n'を、プラットフォームの実際の行末表現(キャリッジ リターン (CR) とラインフィード (LF) バイトの組み合わせ) と混同しています。

標準 I/O ライブラリ関数は、プラットフォームの行末をテキスト モード ストリームの概念的な改行 (デフォルト) に自動的に変換します。テキスト I/O とバイナリ I/O の違いは何ですか?を参照してください。comp.lang.c FAQ から。(これは C FAQ からのものですが、概念は C++ にも適用されます。) Windows を使用しているため、標準 I/O 関数はデフォルトで改行を CR-LF として書き込み、読み取り時に改行に CR-LF を期待します。

これらの変換を行わずに生の純粋なデータを表示したい場合は、ストリームをバイナリ モードに設定する必要があります。バイナリモードでは、 \nLF のみに\r対応し、CR のみに対応します。

"b"C では、フラグの 1 つとして次のように渡すことで、バイナリ モードを指定できますfopen

FILE* file = fopen(filename, "rb"); // Open a file for reading in binary mode.

C++ の場合:

 std::ifstream in;
 in.open(filename, std::ios::binary);

また:

 std::ifstream in(filename, std::ios::binary);
于 2012-08-29T10:45:03.113 に答える