0

ファイルの読み取りについて質問があります。手書き認識の開発を行っているのですが、使用しているツールがトレーニング データ ファイルを読み取らないようで、イライラしています。

したがって、完全に正常に機能するファイルが1つあります。そのファイルの内容の一部をここに貼り付けます。

 è      Aڈ2*A   ê“AêA mwA)àXA$NلAئ~A›إA:ozA)"ŒA%IœA&»ّAم3ACA

|®AH÷AD¢A ô-A گ&AJXAsAA mGA قQAٍALs@÷8´A

ファイルは、最初の 12 バイトが 2 つの long と 2 つの short であり、データが 4 、 1000 、 1024 、 9 であると私が知っている形式ですが、T はファイルを読み取ってこれらの値を取得できません。

実際には、最初の 12 バイトを上記と同様の形式で書き込みたいのですが、その方法がわかりません。

残りのデータは浮動小数点であることを忘れていました。データをファイルに書き込むと、これらのシンボルではなく人間が読めるテキストが取得され、これらのシンボルを読み取っているときに実際の値が取得されません。これらのシンボル全体で実際の浮動小数点数と整数を取得する方法は?

私のコードは

struct rec
{
    long a;
    long b ;
    short c;
    short d;
}; // this is the struct 

FILE *pFile;
struct rec my_record;

// then I read using fread

fread(&my_record,1,sizeof(my_record),pFile);`

abcおよびで取得した値dは、実際の値ではなく、85991456、-402448352、8193、および 2336 です。

4

2 に答える 2

0

コンパイラは、構造体のメンバーにパディングを追加して、(通常は) 4 バイト アラインします。この場合、変数cdがパディングされます。

構造体ではなく、定義済みのデータ型を一度に読み取る必要がfreadあります。

于 2012-05-20T08:09:06.200 に答える
0

まず、そのファイルを 16 進エディタで開いて、含まれているバイト数を正確に確認する必要があります。あなたが投稿したテキストの抜粋から、期待どおりに4、1000、1024、および9が含まれていないと思いますが、異なる文字エンコーディングは同じバイトシーケンスに対して異なる文字を表示するため、テキスト形式は非常に誤解を招く可能性があります.

ファイルに期待されるデータが含まれていることを確認した場合でも、まだ他の問題がある可能性があります。これらの 1 つはエンディアンです。マシンやファイル形式によっては、long最下位バイトが最初に 4 バイトをエンコードするものもあれば、最上位バイトが最初に読み書きされるものもあります。

その他の問題は、使用するlongデータ型に関するものです。コンピューターに 64 ビット アーキテクチャがあり、Linux を使用している場合、longは 64 ビット値であり、構造体の長さは 12 バイトではなく 20 バイトになります。

編集:

あなたのようなリテ エンディアン マシンでビッグ エンディアンの long を読み取るには、データをバイト単位で読み取り、それらから long を手動で構築する必要があります。

// Read 4 bytes
unsigned char buf[4];
fread(buf, 4, 1, pFile);
// Convert to long
my_record.a = (((long)buf[0]) << 24) | (((long)buf[1]) << 16) | (((long)buf[2]) << 8) | ((long)buf[3]);
于 2012-05-20T08:17:38.173 に答える