3

私はこの本の 3 つのプログラムの問題に取り組んできました: C How to Program - Deitelそれらは第 11 章のファイルの管理 (順次およびランダム アクセス ファイル) に関連しています。ランダム アクセス ファイルの 3 つの例 (作成、読み取り、書き込み) を実行できませんでした。3 つの予期しない動作が発生しました。私に見せてください:

  • 最初に、ランダム アクセス ファイル クリエーターを実行しましたが、奇妙なことは何もなく、終了メッセージが表示されます。 ここに画像の説明を入力

  • 次に、ランダムアクセス値ファイルの書き込みをコンパイルして値を入力しますが、奇妙なことは何もありません。 値の入力

  • 3 番目に、hare 戦略を使用し、メモ帳で .dat ファイルを読み込んで、データが適切に保存されたかどうかを確認します。そして、驚きのゴミが表示されます。そして、よく考えたのですが、二重表現が読み取りプログラム (メモ帳) と一致していない可能性があります。というわけで第四段階へ。

ファイルのメモ帳の読み取り

  • 4 番目に、ランダム アクセス ファイルの読み取りプログラムをコンパイルします。驚いたことに、表示されたデータは私が入力したものではありません。

    結果が一致しませんでした

この質問をここに投稿したくなかったのは、もっと重要な質問ともっと興味深い質問があることを知っているからですが、私が間違ったことを見つけることができず、しばらく探していて、最終的に専門家に尋ねることにしました. 以下に SC を残します (ありがとう!):

/*To create the file*/
#include <stdio.h>

struct clientsData{
    int account;
    char lastname[ 30 ], name[ 30 ];
    double balance;
};

int main(void)
{
    int i; 
    struct clientsData client = { 0, "", "", 0.0 };
    FILE *cfPtr;


    if( ( cfPtr = fopen( "clients.dat", "wb" ) ) == NULL ) {
        printf( "File couldn't be opened. " );
    }
    else{
        printf( "Generating\n" );
        for ( i = 1; i <= 10000; i++ ){
            printf( "-" );
            fwrite( &client, sizeof( struct clientsData ), 1, cfPtr );
        }
            fclose( cfPtr );
    }
    printf( "\nFile succesfully created\n" );
    return 0;
}

/* To write the file */
#include <stdio.h>

struct clientsData{
    int account;
    char lastname[ 30 ], name[ 30 ];
    double balance;
};

int main(void)
{
    FILE *cfPtr;

    struct clientsData client = { 0, "", "", 0.0 };

    if( ( cfPtr = fopen( "clients.dat", "rb+" ) ) == NULL ) {
        printf( "File couldn't be opened. " );
    }
    else{
        printf( "Enter account number"" ( 1 to 10000, 0 to end the input )\n?" );
        scanf( "%d", &client.account );

        while( client.account != 0 ){
            printf( "Enter the lastname, firstname and the balance\n?" );
            fscanf( stdin, "%s%s%lf", client.lastname, client.name, &client.balance );
            fseek( cfPtr, ( client.account - 1 ) * sizeof( struct clientsData ), SEEK_SET );
            fwrite( &client, sizeof( struct clientsData ), 1, cfPtr );
            printf( "Enter account number\n?" );
            scanf( "%d", &client.account );
        }
        fclose( cfPtr );
    }
    return 0;
}

/*To read the File*/
#include <stdio.h>

struct clientsData{
    int account;
    char lastname[ 30 ], name[ 30 ];
    double balance;
};

int main(void)
{
    FILE *cfPtr;

    struct clientsData client = { 0, "", "", 0.0 };

    if( ( cfPtr = fopen( "clients.dat", "rb" ) ) == NULL ) {
        printf( "File couldn't be opened. " );
    }
    else{
        printf( "%-6s%-16s%-11s%10s\n", "Acct", "Lastname", "Firstname", "Balance" );

        while( !feof( cfPtr ) ){
            fread( &client, sizeof( struct clientsData ), 1, cfPtr );

            if( client.account != 0 ){
                printf( "%-6d%-16s%-11s%10.2f\n", &client.account, client.lastname, client.name, &client.balance );
            }
        }
        fclose( cfPtr );
    }
    return 0;
}
4

2 に答える 2

4

すべてが正しく保存されているようです。ただし、ここでは値の代わりにポインターを出力します。

printf( "%-6d%-16s%-11s%10.2f\n", &client.account, client.lastname, client.name, &client.balance );

こんな感じでいいの?

printf( "%-6d%-16s%-11s%10.2f\n", client.account, client.lastname, client.name, client.balance );
于 2012-11-13T22:05:02.287 に答える
1

ファイルリーダーのこの行は間違っています:

printf( "%-6d%-16s%-11s%10.2f\n", &client.account, client.lastname, client.name, &client.balance );

現状では、これらの変数の値ではなく、アカウント変数と残高変数へのアドレス(ポインター)を出力しています。

それは読むべきです:

printf( "%-6d%-16s%-11s%10.2f\n", client.account, client.lastname, client.name, client.balance );

役立つヒント:コンパイラの警告を有効にして、このエラーを見つけました。gccこれらの警告を出力しました:

reader.c:26:28: warning: format '%d' expects argument of type 'int', but argument 2 has type 'int *' [-Wformat]
reader.c:26:28: warning: format '%f' expects argument of type 'double', but argument 5 has type 'double *' [-Wformat]

コンパイラ/IDEでこれらの警告を有効にする方法を見つけることは非常に良い考えです。これらの警告は、これらの種類の問題で多くの時間を節約するからです。

于 2012-11-13T22:05:11.630 に答える