0

バイナリファイルでintの配列を読み書きしようとしています。2 つの関数は、多かれ少なかれ次のようになります。

保存機能

int numbers[6]={0, 2, 3, 3, 0, 1};
FILE *file;
if(file=fopen(filename, "wb")==NULL)
{
    printf("Something went wrong reading %s\n", filename);
    return 0;
}
else
{
    int i;
    for(i=0; i<6; i++)
        fprintf(file, "%d", numbers[i]);
}
fclose(file);

負荷関数

FILE *saved_data;
int errors=0;
if((saved_data=fopen(filename, "rb"))==NULL)
    errors++;
else
{
    fread(first, sizeof(int), 1, saved_data);
    fread(second, sizeof(int), 1, saved_data);
    fread(third, sizeof(int), 1, saved_data);
    fread(fourth, sizeof(int), 1, saved_data);
    fread(fifth, sizeof(int), 1, saved_data);
    fread(sixt, sizeof(int), 1, saved_data);
}
fclose(saved_data);

プログラムをデバッグすると、デバッガーは最初の要素が次のようになっていることを通知します

(gdb) print first
$1 = (int *) 0x7fff5fbff968
(gdb) print *first
$2 = 858993200

私はこれを理解できません。エディターで開くと、ファイルには023301と表示されます

4

2 に答える 2

4

の補完機能freadfwriteではなくfprintfです。あなたがしているfprintfのは、整数をバイナリではなくテキストとしてファイルに入れることです。

freadまた、整数ではなくへのポインタを渡すようにしてください。first、などの宣言は表示されませんsecondが、次のようなものを宣言した場合

int first, second, third, fourth, fifth, sixt;

次に、次のようなコードを使用する必要があります

fread(&first, sizeof(int), 1, saved_data);

それよりも

fread(first, sizeof(int), 1, saved_data);

整数はすでに配列にあるため、配列を一度に書き込むことができます

fwrite(numbers, sizeof(int), 6, file);

forループを完全に回避します。

于 2012-11-16T19:57:16.483 に答える
0

ファイルを最後までテキストとして保持することに異論がない場合は、fopen をテキストとして開くように変更し、read ステートメントをテキストとして読み取るように変更します。現状では、ファイルをある部分ではテキストとして扱い、別の部分ではバイナリとして一貫して扱っていないように見えます。これにより、ファイルが破損する可能性があります。

于 2012-11-16T19:58:00.367 に答える