あなたはここに書いたコードは珍しいです:
char *size;
int rc = read(fd, &size, 4);
read
コマンドは、その2番目の引数としてバイトを入れている場所の住所を期待しますそれは読み返している。ここでは、 "私のポインタを構成するバイトをファイルの値で上書きしてください"と言っています。あなたはそれと意味書き込み
printf("%d\n", size);
行う「彼らは整数であるかのように、ポインタのバイトを解釈し、そしてなってしまうどのような値をプリントアウトしてくださいを。」これは、あなたが実質的にchar *
を取っているので、これを行う珍しい方法です。「文字を探す場所」を論理的に表し、それを数字のように扱います。これを忘れて、実際にポインタであるかのようにsize
を試してみると、ほとんど確実にsegfaultが発生し、動作は未定義です。
つまり、char *
はポイントの整数値になりません。 char *
を構成するバイトは、文字通りです。の整数値です。このため、逆参照は機能しません。逆参照とは、「ポインタに従って見つけたものを見る」ことを意味しますが、そのポインタは意味のあるところを指していません。 char *
の大きさや整数のサイズと同じである必要はありませんので、それはです(64ビットシステム上で、あなたはおそらく4であることを8とsizeof(int)
するsizeof(char *)
を見つけることができます)、
さらに悪いですprinttf
を使用して印刷すると、間違ったバイト数が読み取られる可能性があります。
あなたは、整数を読み整数変数を作成し、read
にそのポインタを渡したい場合は、次の
int size;
int result = read(fd, &size, sizeof(size));
これは私のsize
に各バイトのファイル記述子から1つのバイトを読んでください」と言いますこれらのバイトをsize
が占める位置に配置します。ここでは、あなたが読んでいるものについて正直なことです。バイトを整数に読み込むと言うと、これは整数として扱うためです。より正確には、sizeof(size)
バイトを読み込むと言っています。システムの整数のサイズが異なる場合は4バイトです。
あなたは生のバイトを読んで計画している場合は、あなたもより明確にあなたが、具体的に4バイトをしたいことを示すためにuint32_t
またはint32_t
のようなタイプを使用して検討する必要があります。
uint32_t size;
int result = read(fd, &size, sizeof(uint32_t));
は正確にファイル形式は何ですか?あなたが書いた4バイトは何を表していますか? –
私はこのようなファイルを開きます: int fd = open( "file"、O_CREAT | O_WRONLY | O_APPEND、S_IRWXU); – Ehsan
@Ehsanファイルはバイトのストリームです。ファイルにマルチバイト整数を書きたい場合は、その整数を一束としてエンコードする必要があります。どういうわけか、各バイトがその整数の一部を表すように整数を4バイトとしてエンコードしました。各バイトの値を決定するために使用したルールは正確には何ですか? –