2

このタスクにアプローチする方法がわかりません。

特にfwriteを使用する必要がありますが、私の問題は、バイナリファイルの1行にさまざまなファイルタイプ(char []、int、double)を書き込み、インクリメントしてから次のデータロットを書き込む方法がわからないことですリンクされたリストからインクリメントします.....など。

以下のコードは、リンクされたリスト (データ) からテキスト ファイルにデータを書き込み、次の行に移動して、リストの最後の要素がテキスト ファイルに書き込まれるまでプロセスを繰り返します。

同じ原則を持つ関数をコーディングする必要がありますが、fwrite を使用してリンク リストのデータをバイナリ ファイルに書き込みます。アイデアはありますか?

void WriteTextFile(ListDataType *Data, int numEl)
{
    FILE *textfile;

    char name[50];

    printf("\n\nWhat would you like to call the text file in which the data will be stored?\nNB remember to add \".txt\" after your chosen name!!!\nENTER NAME NOW>>");
    scanf("%s", name);

    textfile = fopen(name, "w+");

    do
    {
        fprintf(textfile, "%s %d %d %.2lf %.2lf %.2lf %.2lf\n", Data->component.name, Data->component.int1, Data->component.int2, Data->component.double1, Data->double2, Data->double3, Data->double4 );
        Data = Data->nextPtr;
    }while(Data != NULL);

    fclose(textfile);
}
4

3 に答える 3

2

あなたは次のようなことをしたいでしょう:

fwrite (Data , sizeof(ListDataType), 1, fileHandle);

これにより、Data が指す場所から始まる sizeof(ListDataType) バイトが書き込まれます。Data オブジェクトにポインターが含まれている場合は、新しい構造体を定義し、それに値をコピーしてから、新しい構造体を書き込む必要があります。

動的文字列の最大長を定義できない場合は、文字列の長さを含む構造体を定義できます-構造体を書き、次に文字列を書きます-そうすれば、読み取るバイト数がわかります。いずれにせよ、構造体は、bin ファイルを読み書きするための最も優れた方法です。

わかりました-例を含む編集...

次のようにコンポーネント構造を定義する場合:

    typedef struct Component_Struct
    {
        int int1;
        int int2;
        double double1;
        double double2;
        double double3;
        double double4;
        int nameLen;
        char* name;
    }
    COMPONENT, *LPCOMPONENT;

追加の nameLen に注意してください。値を構造体に割り当てるときに、この値を入力してください。

次に、書き込み関数で:

      FILE * pFile;
      pFile = fopen ("myfile.bin", "wb");

      do
      {
          fwrite(Data->Component, sizeof(COMPONENT)-sizeof(char*), 1, pFile)
          fwrite(Data->Component.name, sizeof(char), Data->Component.nameLen, pFile)
        Data = Data->nextPtr;
      }
      while(Data !=NULL);


      fclose (pFile);
于 2013-10-17T19:49:53.987 に答える
2

可変長データ (動的に割り当てられた文字列ポインター) の項目が 1 つあるため、それをバイナリ ファイルでどのように管理するかを決定する必要があります。出力の構造内に、名前用に固定長のスペースを確保できます。または、ゼロで終わる文字列を書き、そのように管理することもできます。2 番目のケースを選択します。これは、動的文字列により適しているためです。

構造の性質が問題文で与えられていないので、これは少し冗長です。したがって、以下は構造要素を任意の順序で処理します。

void WriteBinaryFile(ListDataType *Data, int numEl)
{
    FILE *bin_file;

    char name[50];

    printf("\n\nWhat would you like to call the binary file in which the data will be stored?\n"
    printf("NB remember to add \".txt\" after your chosen name!!!\nENTER NAME NOW>>");
    scanf("%s", name);

    bin_file = fopen(name, "wb+");

    do
    {
        //NOTE: include terminating zero in the string output; assumes single-byte chars
        fwrite(Data->component.name, strlen(Data->component.name)+1, 1, bin_file);
        fwrite(&Data->component.int1, sizeof(Data->component.int1), 1, bin_file);
        fwrite(&Data->component.int2, sizeof(Data->component.int2), 1, bin_file);
        fwrite(&Data->component.double1, sizeof(Data->component.double1), 1, bin_file);
        fwrite(&Data->component.double2, sizeof(Data->component.double2), 1, bin_file);
        fwrite(&Data->component.double3, sizeof(Data->component.double3), 1, bin_file);
        fwrite(&Data->component.double4, sizeof(Data->component.double4), 1, bin_file);
        Data = Data->nextPtr;
    } while(Data != NULL);

    fclose(bin_file);
}

プログラムがそれを読み返す必要がある場合は、名前を読み込むことから始め、0. 次に、データ型ごとに他の要素を読み取ります。このプロセスは、書き込まれた構造ごとに繰り返されます。ただし、これは必ずしも移植可能ではありません。int 時間などのサイズに注意する必要があります。

于 2013-10-17T20:01:06.203 に答える
0

さまざまなコンポーネントを異なる方法で記述する必要があります。サンプルを確認してください。

fwrite(Data->stringcomponent, strlen(Data->stringcomponent)+1, 1, binaryfile); // writes 1 string
fwrite(&Data->doublecomponent, sizeof(double), 1, binaryfile); // writes 1 double
fwrite(&Data->intcomponent, sizeof(int), 1, binaryfile); // writes 1 int

そのため、単一の fprintf の代わりに、異なるデータに対して複数の fwrite を使用します。さまざまな種類の長さの計算 (strlen+1 または sizeof) と、追加する必要があるかどうかに注意してください&

于 2013-10-17T19:49:46.127 に答える