ページ 11

ファイル操作

Posted: 2008年11月14日(金) 21:52
by しょしょしょしんしゃ
宿題なのですが、
8人の成績データを"seiseki.dat"のファイルとして保存して、
"seiseki.dat"を読み込んでその中身を表示するプログラムを作成すること。
なお、関数にする必要はないです。
"seiseki.data"は

Aki     75 84 82 60 80 85
Daisuke 90 58 86 64 72 44
Eiko    64 78 72 76 77 79
Hiroshi 79 94 63 75 88 90
Kana    75 62 54 78 59 82
Ryuichi 89 65 88 72 85 68
Takashi 66 48 74 67 82 74
Yuka    76 79 75 84 88 70

 というようにする。なお、このファイルは、DATファイルです。
自分なりに考えてみましたがうまくいきませんでした。


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

int main(void)
{
FILE *fp;
char name[30];
int ten;

if((fp=fopen("seiseki.dat","rt"))==NULL){
   printf("fopen error\n");
   exit(0);
}
while(fscanf(fp,"%s %d",name,&ten)!=EOF){
printf("%s %f\n",name,ten);
}
fclose(fp);
return 0;
}

実行例はこのようになるそうです。

seiseki.datの中身を表示します
    1学期  2学期  3学期
名前  英語 数学 英語 数学 英語 数学
Aki     75   84   82  60     80    85
Daisuke 90   58   86   64     72    44
Eiko    64   78   72   76     77    79
Hiroshi 79   94   63   75     88    90
Kana    75   62   54   78     59    82
Ryuichi 89   65   88   72     85    68
Takashi 66   48   74   67     82    74
Yuka    76   79   75   84     88    70

よろしくお願いします

(管理人による記事の修正)

Re:ファイル操作

Posted: 2008年11月14日(金) 22:19
by しょしょしょしんしゃ
すいません 
実行例がずれていました
見難くて


  

Re:ファイル操作

Posted: 2008年11月14日(金) 22:29
by non
>if((fp=fopen("seiseki.dat","rt"))==NULL){
"rt"って何ですか?
>fscanf(fp,"%s %d",name,&ten)
名前のあとに6科目あるのに、なぜ1教科しかないの?

少し教えて欲しいのですが、しょしょしょしんしゃ さんは、大学の1年生くらいで、プログラムの授業ですか?確かに、プログラムはまるなげではありませんが、わかろうという努力はされてます?参考書なり読めばすぐにでもわかりそうな課題なんですが・・・ファイルを読む課題まで授業が進んでいるのなら、もう少し、基本の分かったプログラムを書かれてもいいような気がするのですが。
厳しいことを言って申し訳ありませんが、いつまで経ってもプログラムができるようになりませんよ。
唯単に、課題のレポートを出せばいいのなら、友人にコピーさせてもらった方がいいのでは。

Re:ファイル操作

Posted: 2008年11月14日(金) 22:55
by しょしょしょしんしゃ
すいませんでした。

しかし 残念ながら 自分の実力を知った上で
しかも 私自身そのような友人は、
いませんので このように ネット上の力を借りて
質問しているのです。 
プログラミングの力は uouさん の言うとおり
いつまでも できないかもしれませんが 
誰かの返答で 私自身で何か 発見があるかもしれない
と期待していただけなのです。
できることなら 小言より 何か ヒントを書いてくれる方が
有難かったです....。

>"rt"って何ですか?
テキストファイルの読み込みのことらしいです。違いますか?
 まあ't'はなくてもよろしいのですが...。
 

Re:ファイル操作

Posted: 2008年11月14日(金) 23:25
by Dixq (管理人)
とりあえず沢山いっぺんに作ろうとすると挫折します。
こういうのは少しずつやっていきましょう。

じゃファイルに

「100」

だけかいて保存して下さい。

この100をとってきて表示するだけのプログラムをまず書いてみて下さい。

わかるところから始める事が大事です。

Re:ファイル操作

Posted: 2008年11月14日(金) 23:27
by Dixq (管理人)
「100」

ができたら

「英語 100」

でやってみて、それが出来たら

「英語 100 200 300」

でやってみて・・、次第に完成に持っていってみましょう。

しかしファイルの内容を表示すればいいだけなら1文字ずつとってきて表示したらいいだけの気がしますが・・。

Re:ファイル操作

Posted: 2008年11月14日(金) 23:32
by 初級者
これで点数がもらえるかどうかは、よくわかりません。


#include <stdio.h>

int main(void)
{
    FILE *fp;
    char name[10];
    int a, b, c, d, e, f, i;
    
    fp = fopen("seiseki.dat", "r");
    if (!fp) return printf("file open error\n"), 1;
    printf("               1学期     2学期     3学期\n");
    printf("             英語 数学 英語 数学 英語 数学\n");
    for (i = 0; i < 8; ++i) {
        fscanf(fp, "%s%d%d%d%d%d%d", name, &a, &b, &c, &d, &e, &f);
        printf("%-11s%5d%5d%5d%5d%5d%5d\n", name, a, b, c, d, e, f);
    }
    fclose(fp);
    return 0;
}

Re:ファイル操作

Posted: 2008年11月14日(金) 23:52
by 初級者
別の解です。

#include <stdio.h>

int main(void)
{
    FILE *fp;
    char name[8], a[4], b[4], c[4], d[4], e[4], f[4];
    int i;
    
    fp = fopen("seiseki.dat", "r");
    if (!fp) return printf("file open error\n"), 1;
    printf("             1学期     2学期     3学期\n");
    printf("           英語 数学 英語 数学 英語 数学\n");
    for (i = 0; i < 8; ++i) {
        fscanf(fp, "%s%s%s%s%s%s%s", name, a, b, c, d, e, f);
        printf("%-9s%5s%5s%5s%5s%5s%5s\n", name, a, b, c, d, e, f);
    }
    fclose(fp);
    return 0;
}

Re:ファイル操作

Posted: 2008年11月15日(土) 01:09
by しょしょしょしんしゃ
大変 遅くなりましたが

管理人さんのような練習問題と初級者さんの答えのおかげで、
うまくまとまることができました。
ありがとうございます。

思ったよりは、 uouさんが言っていた通り、用意なプログラムであったので、
私のレヴェルが 低く 申し訳ありませんでした。
#include <stdio.h>
#include<stdlib.h>

int main(void)
{
	FILE *fp;
	int ten1,ten2,ten3,ten4,ten5,ten6,i;
	char name[10];

    printf("               1学期     2学期     3学期\n");
    printf("             英語 数学 英語 数学 英語 数学\n");

	if((fp=fopen("seiseki.dat","r"))==NULL){
		printf("no flile data\n");
		exit(1);
	}
	for(i=0;i<8;++i){
	fscanf(fp,"%s%d%d%d%d%d%d",name,&ten1,&ten2,&ten3,&ten4,&ten5,&ten6 )!=EOF;
	printf("%-11s%5d%5d%5d%5d%5d%5d\n",name,ten1,ten2,ten3,ten4,ten5,ten6);
	}
	fclose(fp);
	return 0;
}

Re:ファイル操作

Posted: 2008年11月15日(土) 07:41
by non
>if (!fp) return printf("file open error\n"), 1;
これをこのまま書かなかったのは賢明です。人のを写したとおもわれますもんね。

>fscanf(fp,"%s%d%d%d%d%d%d",name,&ten1,&ten2,&ten3,&ten4,&ten5,&ten6 )!=EOF;
これは恐らく警告がでるのでは。条件式ですよ。
8回繰り返すことが決まっているのだから、EOFか見る必要がないし、万が一チェックするのなら
if文にしましょう。

Re:ファイル操作

Posted: 2008年11月16日(日) 17:02
by しょしょしょしんしゃ
大変 申し訳ないのですが
また 私の力不足で 詰まってしまいました。
同じような質問 で 悪いのですが
seiseki.dat のファイルに seiseki2.dat というファイル
を読み込んで
seiseki.dat の中身に seiseki2.dat
を追加するプログラムの作成するということなのですが、
上手くいきませんでした。 seiseki2.datはこのようになります。

Eisuke 75 68 74 82 80 77
Hajime 55 68 68 75 82 70
Junko 89 65 83 71 77 58
Kumi 73 90 75 93 65 82
Muneo 66 62 54 70 75 75
Ryota 80 75 72 79 60 66
Sonoko 50 86 45 85 61 89

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

int main(void)
{

	FILE *fp,*fp2;
	int ten1,ten2,ten3,ten4,ten5,ten6,i;
	char name[10];
	char ch;

	
	printf("seiseki.datの中身を表示します。\n");
    printf("        1学期     2学期     3学期\n");
    printf("名前     英語 数学 英語 数学 英語 数学\n");

	if((fp=fopen("seiseki.dat","r"))==NULL){
		printf("no flile data\n");
		exit(1);
	}
   for(i=0;i<8;++i){
	fscanf(fp,"%s%d%d%d%d%d%d",name,&ten1,&ten2,&ten3,&ten4,&ten5,&ten6 )!=EOF;
	printf("%-11s%5d%5d%5d%5d%5d%5d\n",name,ten1,ten2,ten3,ten4,ten5,ten6);
   }
   
   if((fp2=fopen("seiseki2.dat","r"))==NULL){
		printf("no flile data\n");
		exit(1);
	}
   for(i=0;i<7;++i){
	fscanf(fp2,"%s%d%d%d%d%d%d",name,&ten1,&ten2,&ten3,&ten4,&ten5,&ten6 )!=EOF;
	printf("%-11s%5d%5d%5d%5d%5d%5d\n",name,ten1,ten2,ten3,ten4,ten5,ten6);
   }
   while((ch=fgetc(fp2))!=EOF){
	   fputc(ch,fp);
   }
	fclose(fp);
	fclose(fp2);
	return 0;
}
>if((fp=fopen("seiseki.dat","r"))==NULL){
 というところは'r'より'a'のほうが よいのでしょうか?
 ご検討 お願いします。
 
 

Re:ファイル操作

Posted: 2008年11月16日(日) 17:28
by non
>fscanf(fp,"%s%d%d%d%d%d%d",name,&ten1,&ten2,&ten3,&ten4,&ten5,&ten6 )!=EOF;
は、警告が出るって言ったでしょ。無視ですか?

Re:ファイル操作

Posted: 2008年11月16日(日) 17:33
by しょしょしょしんしゃ
>fscanf(fp,"%s%d%d%d%d%d%d",name,&ten1,&ten2,&ten3,&ten4,&ten5,&ten6 )!=EOF;
は、警告が出るって言ったでしょ。無視ですか?

すいません、
どうやって if文にするのか
分からなかったので、そのままでした。
よろしかったら それも教えてもらえませんか?

Re:ファイル操作

Posted: 2008年11月16日(日) 17:35
by non
!=EOF
を消して下さい

Re:ファイル操作

Posted: 2008年11月16日(日) 17:42
by しょしょしょしんしゃ
はい 消しました
これだと ちゃんと 実行できました
どうしてでしょうか

Re:ファイル操作

Posted: 2008年11月16日(日) 17:51
by non
>これは恐らく警告がでるのでは。条件式ですよ。
インターネットの検索で条件式っていれて検索すれば出てきますよ。

ファイルの追加については、例えば、
http://rina.jpn.ph/~rance/c_language/p15.html
ここを読んでから分からないところを尋ねてください。

Re:ファイル操作

Posted: 2008年11月16日(日) 18:09
by non
rかaかa+かはここの方がわかりやすいかも。
http://www.linux.or.jp/JM/html/LDP_man- ... pen.3.html

Re:ファイル操作

Posted: 2008年11月16日(日) 18:09
by たかぎ
>> fscanf(fp,"%s%d%d%d%d%d%d",name,&ten1,&ten2,&ten3,&ten4,&ten5,&ten6 )!=EOF;
> は、警告が出るって言ったでしょ。無視ですか?

まあ、文法的には間違っていないので、警告は出るかもしれませんし、出ないかもしれませんね。

Re:ファイル操作

Posted: 2008年11月16日(日) 18:13
by non
>まあ、文法的には間違っていないので、警告は出るかもしれませんし、出ないかもしれませんね。
でも、レポートなら恐らく減点ですよ。

Re:ファイル操作

Posted: 2008年11月16日(日) 18:22
by しょしょしょしんしゃ
すいません

このことを 読んでも ほとんど、分かりませんでした・・・

”w” ライト(書き込み)・モード
ファイルがなければ作成され、あれば中身が空になる。
 これを使うのでしょうか? 使ったらただ中身が空になるだけなのでは・・・?

”a” アペンド(追加書き込み)・モード
ファイルがなければ作成され、あればファイルの現在位置をファイル・エンドにセットする。
 これを使うと、実行は うまくいきますが、
         seiseki.dat にうまく seiseki2.dat の中身が入りません。

6 アペンド・モードの使用例 を 使用するのですか・・・。

Re:ファイル操作

Posted: 2008年11月16日(日) 19:07
by non
HPに書いてあることを要約すると・・・
aは追加ですから、今回の課題はaでしょう。しかし、aはファイルポインタはファイルの終わりを指します。したがって、最後に追加をすることはできますが、ファイルを先頭から読めません。
ファイルを読みたいならa+を使うか、rで開いてデータを読んだ後、一度閉じ、再度aで開いて追加します。

Re:ファイル操作

Posted: 2008年11月16日(日) 19:16
by しょしょしょしんしゃ
>if((fp2=fopen("seiseki2.dat","r"))==NULL)
この部分を
if((fp2=fopen("seiseki2.dat","a+"))==NULL)
でしましたが
  できませんでした。
 他に 悪いところ はありませんかね・・・・。

Re:ファイル操作

Posted: 2008年11月16日(日) 20:02
by non
>   for(i=0;i<7;++i){
>	fscanf(fp2,"%s%d%d%d%d%d%d",name,&ten1,&ten2,&ten3,&ten4,&ten5,&ten6 )!=EOF;
>	printf("%-11s%5d%5d%5d%5d%5d%5d\n",name,ten1,ten2,ten3,ten4,ten5,ten6);
>   }
>   while((ch=fgetc(fp2))!=EOF){
>	   fputc(ch,fp);
>   }
ファイルポインタは、データを読んだら自動的に移動してます。

Re:ファイル操作

Posted: 2008年11月16日(日) 20:23
by しょしょしょしんしゃ
> for(i=0;i<7;++i){
> fscanf(fp2,"%s%d%d%d%d%d%d",name,&ten1,&ten2,&ten3,&ten4,&ten5,&ten6 )!=EOF;
> printf("%-11s%5d%5d%5d%5d%5d%5d\n",name,ten1,ten2,ten3,ten4,ten5,ten6);
> }
> while((ch=fgetc(fp2))!=EOF){
> fputc(ch,fp);
> }
この部分をなくして
if((fp2=fopen("seiseki2.dat","a+"))==NULL){
		printf("no flile data\n");
		exit(1);
	}
だけ でよろしいのですか?
これでは うまくいきませんでしたが・・・・。
他の部分 も 間違えている可能性が あるので 調べてみます。

Re:ファイル操作

Posted: 2008年11月16日(日) 20:38
by non
>この部分をなくして
全部なくしてどうするの?

Re:ファイル操作

Posted: 2008年11月16日(日) 20:52
by しょしょしょしんしゃ
> while((ch=fgetc(fp2))!=EOF){
> fputc(ch,fp);
> }
 この部分だと
 効果がないのですけど どうですか?

> for(i=0;i<7;++i){
> fscanf(fp2,"%s%d%d%d%d%d%d",name,&ten1,&ten2,&ten3,&ten4,&ten5,&ten6 )!=EOF;
> printf("%-11s%5d%5d%5d%5d%5d%5d\n",name,ten1,ten2,ten3,ten4,ten5,ten6);
> }
 この部分を消すと 上手く実行できませんでした
 全然 3時間考えましたが、わかりません・・・。
 ヒントを もらえませんか・・・

Re:ファイル操作

Posted: 2008年11月16日(日) 21:07
by non
> for(i=0;i<7;++i){
データが7人分だから7回繰り返している。
> fscanf(fp2,"%s%d%d%d%d%d%d",name,&ten1,&ten2,&ten3,&ten4,&ten5,&ten6 )!=EOF;
ファイル2を読み込んでいる。このとき読んだ分だけ、ファイルポインタは移動している。
> printf("%-11s%5d%5d%5d%5d%5d%5d\n",name,ten1,ten2,ten3,ten4,ten5,ten6);
> }
読み込んだデータをディスプレイに表示している。
7回繰り返したのでファイルポインタはファイルの終わり(EOF)を指している。
> while((ch=fgetc(fp2))!=EOF){
ファイルがEOFになるまで繰り返そうとしているが、すでにEOFである。
> fputc(ch,fp);
> }

Re:ファイル操作

Posted: 2008年11月16日(日) 21:29
by しょしょしょしんしゃ
>fscanf(fp,"%s%d%d%d%d%d%d",name,&ten1,&ten2,&ten3,&ten4,&ten5,&ten6 );
>fscanf(fp2,"%s%d%d%d%d%d%d",name,&ten1,&ten2,&ten3,&ten4,&ten5,&ten6 );
 とおいて、
> while((ch=fgetc(fp2))!=EOF){
のEOFが邪魔なのですか・・・?

Re:ファイル操作

Posted: 2008年11月16日(日) 22:11
by しょしょしょしんしゃ
#include <stdio.h>
#include<stdlib.h>

int main(void)
{

	FILE *fp,*fp2;
	int ten1,ten2,ten3,ten4,ten5,ten6,i;
	char name[10];
	char ch;

	
	printf("seiseki.datの中身を表示します。\n");
    printf("        1学期     2学期     3学期\n");
    printf("名前     英語 数学 英語 数学 英語 数学\n");

	if((fp=fopen("seiseki.dat","r"))==NULL){
		printf("no flile data\n");
		exit(1);
	}
   for(i=0;i<8;++i){
	fscanf(fp,"%s%d%d%d%d%d%d",name,&ten1,&ten2,&ten3,&ten4,&ten5,&ten6 );
	printf("%-11s%5d%5d%5d%5d%5d%5d\n",name,ten1,ten2,ten3,ten4,ten5,ten6);
   }
   if((fp2=fopen("seiseki2.dat","a+"))==NULL){
		printf("no flile data\n");
		exit(1);
	}
 for(i=0;i<7;++i){
 fscanf(fp2,"%s%d%d%d%d%d%d",name,&ten1,&ten2,&ten3,&ten4,&ten5,&ten6 ); 
 printf("%-11s%5d%5d%5d%5d%5d%5d\n",name,ten1,ten2,ten3,ten4,ten5,ten6); 
 }
   
    fclose(fp);
	fclose(fp2);
	return 0;
}
このようになりましたが
 まだ上手くできません 修正箇所を あげてください
 自分の限界です。
 解決はまだしていません
 ご協力 お願いします。

Re:ファイル操作

Posted: 2008年11月16日(日) 23:26
by しょしょしょしんしゃ
あと
この問題には 続きがありまして
この15人の点数を読み込んで、
各々 平均点を出すというのもわからないので、
そちらも
お願いします。

Re:ファイル操作

Posted: 2008年11月17日(月) 21:44
by しょしょしょしんしゃ
すいません
まだ 解決していません
お願いします

Re:ファイル操作

Posted: 2008年11月17日(月) 23:30
by 組木紙織
ソースコードだけみて考えていませんか?
まずは自分がやりたいことを日本語で書く。
次に出来るだけ詳しく(C言語の雰囲気で)日本語で書く
コードを書くのはそれからです。

続きの部分はおいといて、本気で最初の課題を考えてください。
ヒントは今までのコメントにあります。



#どんな参考書を使っているか分かりませんし、どのようにC言語を勉強しているのか知りませんが、
#分からないならどこが分からないかを明確にしてください。
#あと、書かれたコメントはきちんと読んで理解しましょう。
#今のままだと永久にC言語を使えるようになるとは思えません。

Re:ファイル操作

Posted: 2008年11月17日(月) 23:48
by kazuoni
組木紙織さんのおっしゃる通り、おそらくまだ考えが浅いと思います。

nonさんが挙げられたページをしっかり読むとNo.24203でおかしな点がすぐ出ると思います。

今から行うことは
>seiseki.dat のファイルに seiseki2.dat というファイル
>を読み込んで
>seiseki.dat の中身に seiseki2.dat
>を追加するプログラムの作成する

ですよね?
以下の点を考えてみてください。

1、seiseki.datに「書き込む」(今自分のseiseki.datのファイル処理はどうなっていますか?)
2、seiseki2.datを読み込む際、自分の用意した変数ですべてのデータを保存する

2、においては、No.24098初級者さんのご回答がヒントになると思います。
これができたら書き込みですね。これもnonさんの挙げられたサイト内にちゃんと書いてあります。