2017-02-12 18 views
0

したがって、テキストファイルをバイナリファイルに変換する必要があります。テキストファイルをcのバイナリファイルに変換する

テキストファイルの例があり得る

姓識別GPA (ストリング列unsigned int型フロート)ままのフォーマットでテキストファイル:

ジョン・スミス32 2.5

ジョー・ヤング12 3.4

void textToBinary(char *inp, char *out) 
{ 

FILE *finp; 
FILE *fout; 
unsigned int x; 
float y; 
char first[SIZE], last[SIZE]; 

finp = fopen(inp, "r"); 
fout = fopen(out, "w"); 

rewind(finp); 

    while(1) 
    { 
    fscanf(finp, "%s %s %u %f\n", first, last, &x, &y); 

    fwrite(first, 1, sizeof(char), fout); 
    fwrite(last, 1, sizeof(char), fout); 
    fwrite(&x, 4, sizeof(unsigned int), fout); 
    fwrite(&y, 4, sizeof(int), fout); 

     if(feof(finp)) 
     { 
     break; 
     } 

    } 

fclose(finp); 
fclose(fout); 
} 

itsunixでdiffコマンドを使うと、出力されたバイナリファイルをバイナリファイルのように見比べることができます。

>diff output.bin b1.bin 
>Binary Files output.bin b1.bin differ 

これは、テキストファイルが適切なバイナリファイルに正しく変換されていないことを意味します。

+0

ヒント: 'size_t fwrite(const void * buffer、size_t size、size_t count、FILE * stream)'のような 'fwrite'パラメータをチェックしてください。特にサイズとカウントを別々に指定する可能性があります。 –

+0

'first'と' last'の両方について、なぜあなたは1つのchar( 'fwrite(first、1、sizeof(char)、fout);')だけを記録したのですか? –

+0

あなたの問題は何ですか?もう一度お読みください[「どうすれば良い質問をしますか?」](http://stackoverflow.com/help/how-to-ask)。 –

答えて

0

fwrite()関数を使用してバイナリファイルにデータを記録する際の誤解を示しています。

エラー1 - 文字列を記録するには、固定サイズまたは実長を使用します。

両方の行に基づいて、fwrite(first, 1, sizeof(char), fout);およびfwrite(last, 1, sizeof(char), fout);

用途:

fwrite(first, (strlen(first)+1), sizeof(char), fout); 

または:

fwrite(first, SIZE, sizeof(char), fout); 

エラー2から1つの要素を使用し、一つだけunsigned intを記録します。

fwrite(&x, 4, sizeof(unsigned int), fout);に基づいています。

用途:

fwrite(&x, 1, sizeof(unsigned int), fout); 

エラー3 - 正しいsizeof()を使用し、1 floatを記録します。

fwrite(&y, 4, sizeof(int), fout);に基づいています。

用途:

fwrite(&y, 1, sizeof(float), fout); 

エクストラ:

すべての場合において、fwrite()を使用するときは、(書かれた要素の数と同じでなければなりません返さ 値をチェックすることを忘れないでください)。

+0

ありがとうございます、私はcharのためのstrlenを考え出しましたが、float/unsigned intのバイト量を変更することは助けになりました –

関連する問題