2
#include <stdio.h>

struct struct_type
{
  int d;
};

int main()
{

  struct struct_type *cust;

  cust->d=13;

  FILE* fp;

  fp = fopen("path to file", "wb+");

  or,

  fp = fopen("path to file", "w+");     

  fwrite(cust, sizeof(struct struct_type), 1, fp);

  fclose(fp);

  return 0;

}

期待される出力

13

ただし、ファイルに書き込まれたガベージ値を取得しています。

4

2 に答える 2

6

にメモリを割り当てたか、ポインタの代わりに単純な構造体を使用したと仮定すると、プラットフォームの int 13のバイナリcust表現を含むファイルが得られます。たとえば、メモ帳では読めないでしょう。

16 進エディタで出力を見ると、いくつかのゼロ バイトと 1 つが表示されます。0xODゼロ バイトの数は、プラットフォームの int のサイズによって異なります。また、それらが 13 バイトの前か後かは、そのエンディアン。

13テキストを含むファイルが必要な場合は、 fprintf.

(メモリを割り当てていないため、プログラムの動作は未定義であり、何でもできます。)


スタック上の構造体で修正します。

#include <stdio.h>

struct struct_type
{
  int d;
};

int main()
{
  struct struct_type cust;
  cust.d=13;

  FILE* fp;
  fp = fopen("path_to_file", "wb+");
  fwrite(&cust, sizeof(cust), 1, fp);
  fclose(fp);

  return 0;
}
$ gcc -Wall -std=c99 -pedantic t.c
$ ./a.out 
$ hexdump -C path_to_file 
00000000  0d 00 00 00                                       |....|
00000004

代わりにテキスト ファイルを取得するには、次のように置き換えますfwrite

fprintf(fp, "%d", cust.d); // or "%d\nd";

オープンモードから「b」を削除します。これは、バイナリ I/O 用であるためです。

于 2013-10-05T09:24:55.037 に答える
2

メノリーを構造体ポインターに割り当てますcust

fwrite(cust, sizeof(struct struct_type), 1, fp);

バイナリ データをファイルに書き込みます。

存在するデータはバイナリデータであり、ゴミではありません。

オブジェクトと印刷に正しく書き込まれるかどうかを確認したい場合。

使用するfread()

それ以外の場合は、整数を文字列に変換してテキスト ファイルに書き込みます。

すると13が見えてきます。

于 2013-10-05T09:25:09.720 に答える