-6

私はCの初心者です。練習用の単純なチケットシステムとしてCプログラムを作成しようとしています。

構造をバイナリファイルに書き込んでから読みたいと思います。しかし、バイナリファイルには何も書き込んでいません。

私が得たものはただ

ファイルが正常に閉じられました。

ファイルが正常に閉じられました。

バイナリ ファイル (ticket.bin) はまだ空です。

構造をバイナリファイルに書き込んで読み取る方法を理解するのに役立つ例を誰かが入力できれば。

define STATIONNUM 10//Maximun number of station.

define rate1 160

define rate2 190

define rate3 230

struct Ticket{

    int code;//code of the list
    char station[20];//destination name.
    int price;//transportation fee.
};



int main(){

    FILE *fp;
    int c;//for open close judgement return value.
    int i;//use at for loop.
    
    struct Ticket list[STATIONNUM]={
    {1, "NewYork", rate1},
    {2, "London", rate1},
    {3, "Paris", rate1},
    {4, "Tokyo", rate1},
    {5, "HongKong ", rate2},
    {6, "Sydney", rate2},
    {7, "Milan", rate2},
    {8, "Berlin", rate2},
    {9, "Vancouver", rate3},
    {10, "Afghanistan", rate3},
    };

    //open a binary file to write.
    fp = fopen("ticket.bin", "wb");
    if(! fp){
        printf("open file fail");
    }
    
    //write data into binary file.
   if (fwrite(list, sizeof(list[0]), STATIONNUM, fp) != STATIONNUM);

    //close it.
    c = fclose(fp);
    
    //judge if it's closed.
    if(c == -1){
        printf("File close failed.\n");
    }else if(c == 0){
        printf("File successfully closed.\n");
    }

    //open binary file to read.
    fp = fopen("ticket.bin", "rb");
    if(! fp){
        printf("open file fail");
    }
    
    fread(list, sizeof(struct Ticket), STATIONNUM, fp);
    
    //close it.
    c = fclose(fp);
    
    //judge if it's closed.
    if(c == -1){
        printf("File close failed.\n");
    }else if(c == 0){
        printf("File successfully closed.\n");
    }

}
4

2 に答える 2

1

あなたのライン

if (fwrite(list, sizeof(list[0]), STATIONNUM, fp) != STATIONNUM);

少なくともあるべき

if (fwrite(list, sizeof(struct Ticket), 
           STATIONNUM, fp) != STATIONNUM)
  { perror("fwrite"); exit(EXIT_FAILURE); };

その後に行うことを検討してくださいif (fflush(fp)) perror("fflush");

そして、あなたは明らかに忘れていました

if fread(list, sizeof(struct Ticket), 
           STATIONNUM, fp) != STATIONNUM)
  { perror("fread"); exit(EXIT_FAILURE); };

成功したfp = fopen("ticket.bin", "rb");行の後。

fopen&のようなすべてのライブラリ呼び出しをテストするのは正しいですfreadが、失敗した場合はperrorエラーの理由を表示する必要があります (または を使用しますstrerror(errno))。

あなたのコード

 fprintf(fp, "%d\t%s\t%d\n", 
         list[i].code, list[i].station, list[i].price);

意味がありません。(その結果fprintfが 3 であるか、そうでないかをテストする必要がありますperror)。fpバイナリ読み取り用に開かれたハンドルにテキストを出力しています! おそらく、あなたはただここにいたいだけですprintf

listところで、実際には配列である変数を呼び出すと、まったく混乱します...

于 2013-09-30T05:23:56.190 に答える