C言語関係掲示板

過去ログ

No.1027 ファイルのバッファリングで出力がうまくいかない

[戻る] [ホームページ]
No.13149

リスト構造のデータのファイルへの出力がうまくいかない
投稿者---keku(2004/03/15 09:23:02)


リスト構造を勉強中で
データの追加や削除、出力を行うプログラムを作っているのですが
初めのコマンドでsを選んだときは、関数save_dataを呼び出し
すべてのノードのデータをファイルに書き込もうと思っているのですが
ファイルに何も書き込まれません。
どこがおかしいのでしょうか、ご教授下さい。
コンパイラはBCC OSはwindows xpです。

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


typedef struct __node{
    int    key;
    char          name[20];
    struct __node   *next;
}Node;

void print(void){
    puts("*****please select job****");
    puts("--------------------------");
    puts("i:insert data");
    puts("d:deleat data");
    puts("f:find list");
    puts("s:save data");
    printf("q:quit\n\n");
    printf("select >");
}

void data_input(int *key,char *name){//データの入力
    char buf[16];
    printf("Please input key >");
    fgets(buf,sizeof(buf),stdin);
    sscanf(buf,"%d",key);
    if(name != NULL){
        printf("Please input name >");
        fgets(buf,sizeof(buf),stdin);
        sscanf(buf,"%s",name);
    }
}

Node *insert_list(int key,char *name,Node *head){//データをリストに挿入
    Node *p;
    
    if ((p=malloc(sizeof(Node))) == NULL) puts("memory error\n"),exit(1);   
    p->key = key;
    strcpy(p->name,name);
    p->next = head;
    return p;
}

Node *deleat_list(int key,Node *head){//データをリストから削除
    Node *p,*q;
    if(head == NULL) {
        puts("Data is nothing!");
        return NULL;
    }
    if (key == head->key){
        p = head->next;
        free(head);
        puts("deleat is compleated!");
        return p;
    } else{
        p = head;
        while (p != NULL){
            if (p->next != NULL && p->next->key == key){
                q = p->next;
                p->next = p->next->next;
                free(q);
                puts("deleat is compleated!");
                return head;
            }
            p = p->next;
        }
    }
    puts("The key is not found");
    return head;
}   

void find_list(Node *p){//リストのデータを標準出力に表示
    printf("----------DATA LIST----------\n");
    while (p != NULL){
        printf("key=%d name=%s\n",p->key,p->name);
        p = p->next;
    }
    printf("-----------------------------\n");
}

void save_data(FILE *f,Node *p){//リストのデータをファイルに書き込む。
    while(p != NULL){
        fprintf(f,"%d,%s\n",p->key,p->name);
        p = p->next;
    }
    puts("Data is saved!");
}

int main(void){
    Node *head=NULL;
    char buf[16],name[16];
    int key;
    FILE *fout;
    
    if ((fout=fopen("db_save.txt","w")) == NULL) puts("open error"),exit(1);
    
    while (print(), fgets(buf,sizeof(buf),stdin) != NULL){
        buf[0] = tolower(buf[0]); 
        puts("");
        switch (buf[0]){
        case 'i':   data_input(&key,name);
                    head = insert_list(key,name,head);
                    puts("Insert is completed!"); break;
        case 'd':   data_input(&key,NULL);
                    head = deleat_list(key,head); break;            
        case 'f':   find_list(head); break;
        case 's':   save_data(fout,head); break;
        case 'q':   puts("End works"); return 0;
        default :   puts("Plese input collectly"); break;      
        } 
        puts("\n");
    }
    fclose(fout);
    return 0;   
}        
    
    


No.13168

Re:リスト構造のデータのファイルへの出力がうまくいかない
投稿者---Cマニア(超初心者)(2004/03/15 13:44:01)


>初めのコマンドでsを選んだときは、関数save_dataを呼び出し
>すべてのノードのデータをファイルに書き込もうと思っているのですが
>ファイルに何も書き込まれません。

初めてのコマンドでsave_dataを呼び出したら、データは入力していないので
何も書き込まれないと思いますが・・・どうでしょうか?

No.13171

Re:リスト構造のデータのファイルへの出力がうまくいかない
投稿者---keku(2004/03/15 14:15:44)


レスありがとうございます。
一応、データ入力をしてからやっているのですが
なぜか、書き込めません。

No.13172

Re:リスト構造のデータのファイルへの出力がうまくいかない
投稿者---Cマニア(超初心者)(2004/03/15 14:39:56)


>レスありがとうございます。
>一応、データ入力をしてからやっているのですが
>なぜか、書き込めません。

私も試してみましたが、ちゃんと書き込まれました。
しかし、プログラム実行中にdb_save.txtを見てみると
saveしても何も書き込まれていませんでした。
プログラムが終了してから書き込まれるみたいです。
これなら大丈夫でしょうか?

No.13173

Re:リスト構造のデータのファイルへの出力がうまくいかない
投稿者---keku(2004/03/15 15:17:45)


>私も試してみましたが、ちゃんと書き込まれました。
>しかし、プログラム実行中にdb_save.txtを見てみると
>saveしても何も書き込まれていませんでした。
>プログラムが終了してから書き込まれるみたいです。
>これなら大丈夫でしょうか?

あ、おっしゃる通り、'q'を入力して終えたら
終了した後に書き込まれてました。どうも下らない質問
だったようで、失礼しました。
本当にありがとうございました。


No.13174

Re:リスト構造のデータのファイルへの出力がうまくいかない
投稿者---Cマニア(超初心者)(2004/03/15 15:50:14)


>あ、おっしゃる通り、'q'を入力して終えたら
>終了した後に書き込まれてました。どうも下らない質問
>だったようで、失礼しました。
>本当にありがとうございました。

いえ、私もfprintfで書き込まれないことがあって、
前から疑問に思ってたのでこういうことが分かって良かったです。
これもkekuさんのおかげですね(^_^;)こちらこそです。


No.13175

Re:リスト構造のデータのファイルへの出力がうまくいかない
投稿者---nop(2004/03/15 15:58:10)


>しかし、プログラム実行中にdb_save.txtを見てみると
>saveしても何も書き込まれていませんでした。
>プログラムが終了してから書き込まれるみたいです。

それはバッファリングの関係でしょう。
ファイルのオープンとクローズを、
ファイルに書き込む関数の中で行えば問題ないかと思います。

No.13177

Re:リスト構造のデータのファイルへの出力がうまくいかない
投稿者---keku(2004/03/15 17:47:39)


>それはバッファリングの関係でしょう。
>ファイルのオープンとクローズを、
>ファイルに書き込む関数の中で行えば問題ないかと思います。

なるほど・・・勉強になりました、ありがとうございます。


No.13184

Re:リスト構造のデータのファイルへの出力がうまくいかない
投稿者---RAPT(2004/03/16 01:57:39)


バッファリングされていたとき、すぐに結果を反映させるのには、
fflush()関数を用います。