掲示板利用宣言

 次のフォームをすべてチェックしてからご利用ください。

 私は

 題名と投稿者名は具体的に書きます。
 課題の丸投げはしません。
 ソースの添付は「HTML変換ツール」で字下げします。
 返信の引用は最小限にします。
 環境(OSとコンパイラ)や症状は具体的に詳しく書きます。
 返信の付いた投稿は削除しません。
 マルチポスト(多重投稿)はしません。

掲示板2

管理者用メニュー    ツリーに戻る    携帯用URL    ホームページ    ログ    タグ一覧

No.28107

ファイルから読み込んだ構造体をソートする
投稿者---kana(2006/09/11 23:49:56)


こんばんは、掲示板お借りします。

自分で作成して書き込んだ構造体のファイルを、
再度読み込んでソート処理するプログラムで苦戦しております。
キーボードで一組ずつデータを入力する時は問題なくソートできるのですが、
ファイルから一行ずつ書式付読み込み(下記)を行った後が、上手くいきません。

while( fgets( line, 100, fw ) != NULL ) {
        sscanf(line, "%s    %d  No.%d", name, &size, &count); 
}

このループに入れ子にするループの指定に問題があるような気がするのですが、
色々試してみても表示されないか一行読み込んで止まってしまいます。


この投稿にコメントする

削除パスワード

発言に関する情報 題名 投稿番号 投稿者名 投稿日時
<子記事> Re:ファイルから読み込んだ構造体をソートする 28110 通りすがり 2006/09/12 08:20:12
<子記事> Re:ファイルから読み込んだ構造体をソートする 28111 nano 2006/09/12 09:30:57
<子記事> Re:ファイルから読み込んだ構造体をソートする 28146 kana 2006/09/14 00:12:52


No.28109

Re:ファイルから読み込んだ構造体をソートする
投稿者---kolona(2006/09/12 04:48:37)


構造体の定義(宣言)と処理するファイルの内容、開発環境(OSとコンパイラ)が書かれてないと誰も的確な解答ができません。
あと、コンパイルできるソース一式を載せた方がいいです。どうしてもソースが載せられない事情があるときには、問題が再現する最小限のコード(関数呼び出しのみとか)を作成するといいです。時にはそうやって関数を単体でテストするだけで解決することもあります。


この投稿にコメントする

削除パスワード

No.28110

Re:ファイルから読み込んだ構造体をソートする
投稿者---通りすがり(2006/09/12 08:20:12)


むしろそんな複雑なことではなく、sscanfが改行を読み込んだことが原因だったりしませんか?

"%s %d No.%d"



" %s %d No.%d "

に替えてみてはいかがでしょう?



この投稿にコメントする

削除パスワード

No.28111

Re:ファイルから読み込んだ構造体をソートする
投稿者---nano(2006/09/12 09:30:57)


>    while( fgets( line, 100, fw ) != NULL ) {
>        sscanf(line, "%s    %d  No.%d", name, &size, &count); 
>}

fgets関数で読み取った改行文字を配列から除きたいのであれば、
sscanf関数を実行する前に
        line[strlen(line)-1] = '\0';

のようにするとよいかも。


この投稿にコメントする

削除パスワード

No.28117

Re:ファイルから読み込んだ構造体をソートする
投稿者---kana(2006/09/12 10:31:14)


レスありがとうございます。環境はWindowsでC++です。
全く関係ないと思う部分以外のソースを載せましたので、
おかしい部分をご指摘いただければと思います。

構造体の定義は以下の通りです。
struct list {
        char name[20]; 
        int size;
      int count;
        struct list *next;
};

メインの関数は以下のように設定しています。
int main(){
    struct list *head= NULL;
    int code;

    while(1){
    printf("書込み:%d  読込み:%d 終了:%d  処理>>", 1,3,5);
    scanf( "%d", &code );
    if(code==5)      break;
    else if(code==1){   /*書き込み処理省略*/
    }else if(code==3){  /*読み込み処理 ここが上手くいきません。*/ 
                       dataread(head);
    }else{
            printf( "入力エラー\n" );}
    }
    return 0;
}

読み込み関数は以下のように設定(実際はメイン関数の上)
struct list *dataread( struct list *p )
{
    FILE *fw;
    char line[100];
    struct list *head;
    char name[20];
    int size, count;

    if( ( fw=fopen( "data.dat", "r" ) ) == NULL ||  "data.dat"  == NULL ) {
        printf( "ファイルオープン失敗\n" );
        exit( 1 );
        }

    while( fgets( line, 100, fw ) != NULL ) {
        sscanf(line, "%s    %d  No.%d", name, &size, &count); 
        head = add_list( name, size, count, head );/*前述した関数(エラー)*/
    }

    fclose( fw );
    return(p);
}



この投稿にコメントする

削除パスワード

No.28119

Re:ファイルから読み込んだ構造体をソートする
投稿者---nano(2006/09/12 11:24:40)


>    }else if(code==3){  /*読み込み処理 ここが上手くいきません。*/ 
>                       dataread(head);

dataread関数には戻り値がありますが、使わなくてよいのですか?
>struct list *dataread( struct list *p )

引数で受け取った p を何も処理しないまま、単に return p;
していますが、それでよいのですか?
>    if( ( fw=fopen( "data.dat", "r" ) ) == NULL ||  "data.dat"  == NULL ) {

「|| "data.dat" == NULL」は不要です。



この投稿にコメントする

削除パスワード

No.28147

解決しました!!
投稿者---kana(2006/09/14 00:15:07)


>dataread関数には戻り値がありますが、使わなくてよいのですか?
戻り値の表記が無いという初歩的なミスだったのですね。
皆様のお陰で無事問題解決しました。
ありがとうございました!!



この投稿にコメントする

削除パスワード

No.28146

Re:ファイルから読み込んだ構造体をソートする
投稿者---kana(2006/09/14 00:12:52)


キーボードからデータを一件ずつ入力する時に使っている関数です。
この関数は問題なく機能しているのはキーボード入力で確認済みです。

struct list *add_list( char *str, int size, int count, struct list *head )
{
        struct list *p, *new_p;

        if ( ( new_p = ( struct list * )malloc( sizeof( struct list ) ) ) == NULL ) {
                printf( "malloc error\n" );
                exit( 1 );
        }
        strcpy( new_p->name, str );
        new_p->size = size;
        new_p->count = count;

        if ( head == NULL || size > head->size ) {
                new_p->next = head;
                return new_p;
        }

        for ( p = head;  p->next != NULL; p = p->next )
                if ( size > p->next->size ) break;

        new_p->next = p->next;
        p->next = new_p;
        return head;
}



この投稿にコメントする

削除パスワード

No.28150

Re:ファイルから読み込んだ構造体をソートする
投稿者---nano(2006/09/14 09:35:21)


次回から、掲示板利用宣言にある「返信の付いた投稿は削除しません」を
お守りくださるようお願いいたします。
スレッドの途中がなくなってしまうと、全体の流れがわからなくなってしまう
おそれがあります。


この投稿にコメントする

削除パスワード

管理者用メニュー    ツリーに戻る    携帯用URL    ホームページ    ログ    タグ一覧