5

出力に VTK データ型を使用しています。私のデータはますます大きくなってきているので、それを ASCII で書き込むのにかなりの時間がかかっています。

それをバイナリ形式に変更する必要がありますが、問題は、ファイルにいくつかのヘッダーがあることです ( http://www.vtk.org/VTK/img/file-formats.pdfを参照)。バイナリ ファイルでも ASCII で記述する必要があります。 .

現在、バイナリ形式の経験が十分ではありません。最初の試みは、経由で2つのストリームを開くことでした

ofstream asciiWriter(file_name.c_str());
ofstream binWriter(file_name.c_str(), ios::app | ios::binary);

問題は、出力がまとまりがなく、正しい順序で出力されasciiWriterbinWriterいないため、ParaView でファイルを後処理できないことです。私が試したことの 1 つは、ヘッダー/データの書き込みが完了したらいつでもasciiWriter.flush()andを使用するbinWriter.flush()ことでしたが、それも役に立ちません。

私は何をすべきか?

PS: VTK パッケージ自体は使用したくありません...その巨大さは私のコードの依存関係に追加されます!

4

1 に答える 1

5

私が知っているすべての最新のシステムでは、バイナリファイルとテキストファイルの唯一の違いは、Cランタイムライブラリによる改行とファイルの終わりの文字の処理です。具体的には、* nixシステムでは、テキストファイルとバイナリファイルはまったく同じように動作します。Windowsでは、'\n'テキストファイルにaを書き込むと、'\r'(CR)の後に'\n'(LF)が実際のファイルに書き込まれます。ペアを読み取る"\r\n"と、単一として表示され'\n'ます。'\x1A'また、Windowsでは、テキストファイルから(Ctrl-Z、EOF)を読み取ると、ファイルの終わりの状態が示されます。バイナリファイルは、変換なしで逐語的に読み書きされます。

あなたの文書を読んで、私はそれが行の終わりに'\n'のみ(ではなく)指定していることに気づきました。"\r\n"これは、Windowsでも、ヘッダーをバイナリファイルとして読み書きすることが正しいアプローチであることを示しています。

無関係なことですが、一部の古いシステム(RSX-11とVMSが思い浮かびます)には、ディスク上でテキストファイルとは大きく異なるバイナリファイルがありました。また、OSで直接レコードベースのインデックスファイルをサポートしていました。ただし、ファイルを開くときに指定できる多数の引数を処理するためにopen()、 etc関数(および他の言語の同等の関数)のバージョンが変更されていました。fopen()このようなシステムでは、毎回正しいファイルモードを使用する必要がありました。

于 2012-05-15T20:36:14.537 に答える