2011-01-26 20 views
0

私は答えを知っていると思うが、私は人々の反応に興味がある。バイナリファイルを読む

現在、私は次の(簡体字コード)を使用して、テキストファイルを読み込み、W2K3上で実行されているVC6アプリを持っている:

string line; 
ifstream infile("test.txt",ios::in); 
while (!infile.eof()) 
{ 
    getline(infile,line); 
} 
... 

ファイルの各レコードは、パイプ区切りのフィールドを持っており、コードが正常に動作しますフィールドとレコードは固定長ではありませんが、CRLFのおかげです。今問題は、テキストに加えて、符号なしのパック10進数のデータがあるため、ファイルがバイナリになることです。基本的には、上記のコードは、バイナリファイル(デリミタとLF保持)として開いても有効ですか?いくつかのダミーデータを使って簡単なテストを試みましたが、同じように動作するように見えました。

バイナリファイルはデータコンテンツの知識を持って読み込まれるので、バイトは正しく検索され、L/Fがありません。私はウェブを検索し、C++やその他の.NET言語(オプション)のさまざまなオプションを見つけましたが、可変サイズのデータ​​とLFが目的を破っているような場合でも、一度に1行を読むことはできません。バイナリファイルを使用しています。ファイル全体を一度に読み込むことは望ましくありません(一度に1つの文字を読み込まないことを望んでいます)。

上記が有効な場合、データが失われる可能性はありますか?もしそうでなければ、他の選択肢もあります。私がここに何かを見逃しているならば、詳しく教えてください。

答えて

0

CRLFで制限されている行に頼る場合、バイナリデータにCRLFがあると、改行が正しく行われません。また、バイナリデータに値124(垂直パイプ)が含まれている場合は、カラムの決定に問題があります。

+0

合意しましたが、LFとパイプは "データ"の一部ではないので、フィールドとラインの区切り記号として使用できます。 – user589918

+0

私は長い間パック10進形式では働いていませんが、実際には '0000 1101'、' 0000 1010'または '0111 1100'というバイトシーケンスは決して書かれないでしょうか? 'getline'は最初の2つのうちの1つまたは両方を探しています(あなたが呼んでいるものに依存します)。分割アルゴリズムは最後のものを探します。 –

+0

私はCの人ではないので、getlineはあまりよく分かりませんが、C#/ VBではファイルをテキストとして読み込むために 'StreamReader'を使用し、エンコーディング(ASCII/UTF8 /など)を使用して、生のバイトを解析する必要があります。エンコーディングが読み込まれたバイトをサポートしている限り、その文字列を扱うことができます。あなたがエンコーディングを認識していることを確認してください。 ASCIIは1バイト/文字ですが、UT8は1〜6バイト/文字です。 –

関連する問題