2016-07-24 11 views
-1

私は、次のコードへの出力を把握しようとしています:ファイル - 予期しない出力

#include <stdio.h> 

int main() 
{ 
    FILE *f; 
    int i = 20; 
    if ((f = fopen("file.DAT", "wb")) != NULL) { 
     fwrite(&i, 4, 1, f); 
     fclose(f); 
    } 
    return 0; 
} 

32-bitシステム、paragraph sign(小数点以下ascii182)には、バイナリファイルに書き込まれます。

質問asciiの値がバイナリファイルに書き込まれるかどうかを確認するにはどうすればよいですか?

関数fwriteの最初の引数は配列へのポインタですが、配列内の配列は定義されていません。バイナリファイルに書き込むバイトを追跡するには?

+2

をお読みください。 ASCII値が182の段落記号ではありません。 – immibis

+0

'&i'は' i'へのポインタを意味します。 'i'は整数ですので、' i'が指すアドレスから4バイトのメモリを 'file.DAT' –

+3

@immibis:値「0x20」の場合のみ、*小数点の場合は「20」ではありません。文字としての「20」の解釈は、それを表示するソフトウェアによって異なります。 – usr2564301

答えて

2

このコードでは、intiの内部表現を、バイナリモードで開いたファイルfile.DATに書き込みます。 &iは配列のアドレスではなく、ローカル変数iのアドレスです。 fwriteはそのアドレスに4バイトを書き込みます。これは32ビットシステムで問題の整数を構成します。インテルPCやMacなどのリトルエンディアンアーキテクチャ、オン

、ファイルが値を持つ4バイト含まれている必要があります

+---------------------------+ 
| 0x14 | 0x00 | 0x00 | 0x00 | 
+---------------------------+ 

しかし、このような古いMacなどのビッグエンディアンのマシン、上に、ファイルの内容は次のようになります。

+---------------------------+ 
| 0x00 | 0x00 | 0x00 | 0x14 | 
+---------------------------+ 

あなたは端末に、このファイルを印刷したり、エディタにロードする場合は、非ASCII値0x14およびその他のマークまたはnullバイトのためにどれのための変な文字が表示されることがあります。この文字は段落記号として表示されます。これは、エディタが何らかの文字セット変換を実行するためです。バイナリダンプユーティリティを使用して、ファイルの正確な内容を確認します。より移植性のために

、コードは、それは(私の知るほとんどのプラットフォーム上で)スペースと3つのNULバイトを書き込む必要がありfwrite(&i, sizeof i, 1, f);

関連する問題