今回もよろしくお願いします

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
sub

今回もよろしくお願いします

#1

投稿記事 by sub » 18年前

今回も学校の課題なのですが、よろしくお願いします。

成績データの件数に上限を設けることなく、また、扱うデータ件数の増減に柔軟に対応できるよう、一方向の連結リストを用いて成績データを記憶するようにしろ、ということみたいです。

一応エラーはすべて消せたのですが、連結リストとかポインタすらあまりわかっていないのでかなり厳しく、たいへん見にくいしいろいろ間違ってると思います。

それに前の課題ではできていたはずなのに、書き換えてみると
ファイルが開けません
になってしまうのです。

実行結果は下です

CMD>r data1.txt
file open error.

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

typedef struct score Score;

struct score{
      char name[40];
      int eng ,mat, sci;
      Score *next;
      };

Score *p, *head, **last;

int main (void){

char cmd[256], fname[20], rank, str[256];
char f_inp[256];
FILE *fp;


while (rank!='q'){ 
       printf("CMD>"); 
       fflush(stdout); 
       fgets(cmd, 20, stdin); 
       sscanf(cmd, "%c %s", &rank, fname); 
     
     
     switch(rank){ 
        	
        	
     case 'r':
	     if((fp = fopen(str, "r")) == NULL){
		 printf("file open error.\n");
		 return(1);
	   }
	     last = &head;
	     while(fgets(f_inp, 256 ,fp) != NULL){
		    p=(Score*)malloc(sizeof(Score));
		    sscanf(f_inp, "%s %d %d %d", p->name, &p->eng, &p->mat, &p->sci);
		    *last = p;
		    last = &(p->next);
		    *last = NULL;
		   }
	    fclose(fp);
	
	break;
	
     case 'd':          
     
     	p = head;
	    printf("name/eng/math/sci\n");
	    while(p != NULL){
		   printf("%s %d %d %d\n", p->name, p->eng, p->mat, p->sci);
		   p = p->next;
	    }
           break; 
     
     
     case 'q': 
        fclose(fp); 
        printf("File close!\n"); 
        break; 
     
     
 default: 
        printf("コマンドを正しく入力してください\n"); 
    } 
} 
    return (0); 
}
読みこむファイルは下のような感じです
b 10 10 10
d 20 20 20
c 30 30 30
a 40 40 40
e 50 50 50

どこがどう間違っているのか教えていただけないでしょうか?
お願いします。

Justy

Re:今回もよろしくお願いします

#2

投稿記事 by Justy » 18年前

>書き換えてみると ファイルが開けません
 そりゃぁ、fname変数にファイル名が入ってるのに開こうとしているのが str変数じゃぁ・・・・。


 あと直接的には関係ないですが、変数に値を初期化 or 代入する前に、読み出そうとしている
ものがいくつかあるようです。

sub

Re:今回もよろしくお願いします

#3

投稿記事 by sub » 18年前

うぁ、こんなところをミスするなんて・・・

ありがとうございます!


>あと直接的には関係ないですが、変数に値を初期化 or 代入する前に、読み出そうとしている
ものがいくつかあるようです。

これはどういうことなのでしょうか?

フリオ

Re:今回もよろしくお願いします

#4

投稿記事 by フリオ » 18年前

 
 それから、"fopen"と、"fclose"の数が合ってないのでは?
 

sub

Re:今回もよろしくお願いします

#5

投稿記事 by sub » 18年前

ぁぁ、ほんとだ・・・

'r'のときのfcloseが多かったです、ありがとうございます!

Justy

Re:今回もよろしくお願いします

#6

投稿記事 by Justy » 18年前

>>あと直接的には関係ないですが、変数に値を初期化 or 代入する前に、
>>み出そうとしている ものがいくつかあるようです。
>これはどういうことなのでしょうか?

 rank変数が、未初期化のまま rank!='q'と比較しようとしているところです。
 このときの rank値は不定なので、たまたま 'q'が入っていたりすると、
一度も while()内を実行することなく、終わってしまうかもしれません。
(fpも いきなり'q'を実行すると未初期化のまま、fcloseを実行していました)

閉鎖

“C言語何でも質問掲示板” へ戻る