2016-01-05 12 views
8

私はASCIIテキストファイルを読んでいます。これは、各フィールドのサイズ(バイト単位)によって定義されます。例えば。各行は、一部の文字列の場合は10バイト、浮動小数点値の場合は8バイト、整数の場合は5バイトなどで構成されます。C++はEOLのサイズ(バイト単位)を取得します

私の問題は、OSに応じて可変サイズの改行文字を読んでいることです(通常は2バイトのウィンドウと1バイトのLinuxと思われます)。

C++でEOL文字のサイズを取得するにはどうすればよいですか?

たとえば、Pythonで私が行うことができます。

len(os.linesep) 
+4

ファイルをテキストモードで開く場合、改行は、ネイティブの行末が何であれ、常に「\ n」でなければなりません。ネイティブEOL文字列のサイズを本当に知る必要がありますか? – Badministrator

+0

ファイルが読み込まれたコードと同じOSで保存されていることが保証されていますか?はいの場合、ファイルをバイナリ形式ではなくテキスト形式で開きます。 – dxiv

答えて

0

私はあなたがそれだと思うどこ翻訳が発生することはよく分かりません。次のコードを見てください:Windows上で実行されている。この後

ostringstream buf; 
buf<< std::endl; 
string s = buf.str(); 
int i = strlen(s.c_str()); 

を、私は== 1だから、STDにおけるライン定義の最後は1つの文字です。他の人がコメントしたように、これは "\ n"文字です。

+0

このコードは間違っています。なぜなら、CRTのlibは '\ n'をメモリ内のバッファに対して' \ r \ n 'にしませんが、ファイルとコンソールに対してはそうしているからです。 –

+0

ここでは、私が反対している問題を実証しています。 C++はファイル/コンソールに書き込むときに "\ n"をos特有の文字に変換しますが、バッファには変換しません。 – jramm

+0

@jramm私はあなたがあなたの問題を十分に説明したとは思わない。 '\ n'はバッファに書き込まれたときには何もエンコードされる必要はありません(実際にはできません)。しかし、そのバッファを* text *モードでオープンされたファイルに書き込んだら、 '\ n'は自動的にプラットフォームが要求するものに変換されます。そして、同じファイルを_text_モードで開いて読み返すと、改行シーケンスは '\ n'に変換されます。ですから少なくとも、ディスク上のファイルで '\ n'のエンコーディングを知る必要があるのはなぜか分かりません。 – dxiv

1

これを行うには、行を読むことが大切です。

最後の文字は\nです。それを取り除く。その後、前の文字を見てください。それは\rまたはそれ以外のものです。 \rの場合は削除します。

Windowsの[ASCII]テキストファイルの場合、他の方法はありません。

ファイルが混在していても(たとえば、一部の行が\r\nで、一部が\nなど)、これは機能します。

あなたは奇妙なことに対処していないことを確かめるために、これを数行で暫定的に行うことができます。

これで、ほとんどのファイルで何を期待するのかが分かりました。しかし、ストリップ法は一般的に信頼できる方法です。 Windowsでは、Unixからファイルをインポートすることができます(またはその逆)。

+0

ニフティックは半分ですが、行末文字が何であるかを知らずに '行を読む 'ことは難しいです。例えば、あなたのレシピは '\ r'行ターミネータで失敗し、連続した空行は' \ r \ n \ n \ n 'として保存され、windows-landで見られます。 – dxiv

+1

@dxivこの方法は '\ r \ n \ n \ n'(例えば' \ r \ n \ n \ n')に対して働きます。私は20年以上の間に '\ r'のみのファイルを見たことはありません。もしあれば、1000のファイルを変換しました。多くのプログラムでは、少なくとも改行を前提としているため、読み込みができません。 DOSの 'type file'を試してみてください;-)私はMSももうサポートしていないと思います。 '\ r'は、行の始まり(例えば、取得された進捗出力)で有効です。私はこれ以上のことを見てきました(例えば、\ rpgmは56%完了\ rpgmは57%完了です)。 –

+0

@CraigEstey - 旧式のMacファイルは\ rのみです。 wikipediaを参照してください:https://en.wikipedia.org/wiki/Newline – user3690202

関連する問題