6

私は次のプログラムを持っています:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#define MAXLEN 100

typedef struct {int key; char data[MAXLEN];} record;

main(int argc, char *argv[])
{
    int n, i;
    record x;
    FILE *fp;
    fp = fopen(argv[1], "w+");
    printf("How many records will be entered? \n");
    scanf("%d", &n);
    for (i=0; i<n; i++)
    {
        printf("Enter record: \n");
        scanf("%d", &x.key);
        scanf("%s", &x.data);
        fwrite(&x, sizeof(record), 1, fp);
    }
}

私がやっていることは、ユーザー入力からレコードを作成し、これらの「レコード」をファイルに保存することです。ただし、fwrite()を使用すると、作成されるファイルには、各レコードにキーとデータが含まれるだけでなく、多くの奇妙な文字が書き込まれます。なぜこれらの奇妙なキャラクターをすべて書いているのか誰か教えてもらえますか?

4

3 に答える 3

4

いくつかの理由:

  1. scanfを使用すると、人間が読める形式(%d)が、コンピューターが直接使用する形式(int)に変換されます。次に、コンピューターで読み取り可能なフォームをファイルに書き出します。これで、ファイルを表示するときに、コンピューターから人間が読み取れる形式の逆ではなく、はるかに低いレベルの形式を使用しています。これはあなたに間違っているように見える何かを与えるでしょう。
  2. x.dataに部分的なデータを読み込んだ場合でも、x.data全体を書き出しています(たとえば、長さが10の文字列を読み込んでいます)。x.dataの残りの部分は「初期化されていない」ものであり、main()が呼び出されたときにメモリに残っていたものがすべて含まれています。
于 2012-12-07T05:38:29.480 に答える
1

フロッピーディスクイメージからBIOSパラメータブロック構造を読み取るときにも、同じ種類の問題が発生しました。#pragma pack(1)ディレクティブを使用して解決しました。サンプルコードは以下のとおりです。

#pragma pack(1)
struct bpb
{
    unsigned char jmpinstruction[3];
    unsigned char oem[8];
    short bytespersector;
    ....
};
#pragma pack()
于 2013-05-11T17:09:58.117 に答える
0

プレーンテキストではなく、バイナリレコードとしてデータを保存しています。

メモ帳を使用して表示することはできません。

レコードを表示するには、ファイルから同じ構造にレコードを読み取る別のプログラムを作成する必要があります。

于 2012-12-07T05:38:49.403 に答える