ファイル操作

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

ファイル操作

#1

投稿記事 by しょしょしょしんしゃ » 16年前

宿題なのですが、
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:ファイル操作

#2

投稿記事 by しょしょしょしんしゃ » 16年前

すいません 
実行例がずれていました
見難くて


  

non

Re:ファイル操作

#3

投稿記事 by non » 16年前

>if((fp=fopen("seiseki.dat","rt"))==NULL){
"rt"って何ですか?
>fscanf(fp,"%s %d",name,&ten)
名前のあとに6科目あるのに、なぜ1教科しかないの?

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

しょしょしょしんしゃ

Re:ファイル操作

#4

投稿記事 by しょしょしょしんしゃ » 16年前

すいませんでした。

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

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

Dixq (管理人)

Re:ファイル操作

#5

投稿記事 by Dixq (管理人) » 16年前

とりあえず沢山いっぺんに作ろうとすると挫折します。
こういうのは少しずつやっていきましょう。

じゃファイルに

「100」

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

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

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

Dixq (管理人)

Re:ファイル操作

#6

投稿記事 by Dixq (管理人) » 16年前

「100」

ができたら

「英語 100」

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

「英語 100 200 300」

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

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

初級者

Re:ファイル操作

#7

投稿記事 by 初級者 » 16年前

これで点数がもらえるかどうかは、よくわかりません。


#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:ファイル操作

#8

投稿記事 by 初級者 » 16年前

別の解です。

#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:ファイル操作

#9

投稿記事 by しょしょしょしんしゃ » 16年前

大変 遅くなりましたが

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

思ったよりは、 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;
}

non

Re:ファイル操作

#10

投稿記事 by non » 16年前

>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:ファイル操作

#11

投稿記事 by しょしょしょしんしゃ » 16年前

大変 申し訳ないのですが
また 私の力不足で 詰まってしまいました。
同じような質問 で 悪いのですが
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'のほうが よいのでしょうか?
 ご検討 お願いします。
 
 

non

Re:ファイル操作

#12

投稿記事 by non » 16年前

>fscanf(fp,"%s%d%d%d%d%d%d",name,&ten1,&ten2,&ten3,&ten4,&ten5,&ten6 )!=EOF;
は、警告が出るって言ったでしょ。無視ですか?

しょしょしょしんしゃ

Re:ファイル操作

#13

投稿記事 by しょしょしょしんしゃ » 16年前

>fscanf(fp,"%s%d%d%d%d%d%d",name,&ten1,&ten2,&ten3,&ten4,&ten5,&ten6 )!=EOF;
は、警告が出るって言ったでしょ。無視ですか?

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

non

Re:ファイル操作

#14

投稿記事 by non » 16年前

!=EOF
を消して下さい

しょしょしょしんしゃ

Re:ファイル操作

#15

投稿記事 by しょしょしょしんしゃ » 16年前

はい 消しました
これだと ちゃんと 実行できました
どうしてでしょうか

non

Re:ファイル操作

#16

投稿記事 by non » 16年前

>これは恐らく警告がでるのでは。条件式ですよ。
インターネットの検索で条件式っていれて検索すれば出てきますよ。

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

non

Re:ファイル操作

#17

投稿記事 by non » 16年前

rかaかa+かはここの方がわかりやすいかも。
http://www.linux.or.jp/JM/html/LDP_man- ... pen.3.html

たかぎ

Re:ファイル操作

#18

投稿記事 by たかぎ » 16年前

>> fscanf(fp,"%s%d%d%d%d%d%d",name,&ten1,&ten2,&ten3,&ten4,&ten5,&ten6 )!=EOF;
> は、警告が出るって言ったでしょ。無視ですか?

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

non

Re:ファイル操作

#19

投稿記事 by non » 16年前

>まあ、文法的には間違っていないので、警告は出るかもしれませんし、出ないかもしれませんね。
でも、レポートなら恐らく減点ですよ。

しょしょしょしんしゃ

Re:ファイル操作

#20

投稿記事 by しょしょしょしんしゃ » 16年前

すいません

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

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

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

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

non

Re:ファイル操作

#21

投稿記事 by non » 16年前

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

しょしょしょしんしゃ

Re:ファイル操作

#22

投稿記事 by しょしょしょしんしゃ » 16年前

>if((fp2=fopen("seiseki2.dat","r"))==NULL)
この部分を
if((fp2=fopen("seiseki2.dat","a+"))==NULL)
でしましたが
  できませんでした。
 他に 悪いところ はありませんかね・・・・。

non

Re:ファイル操作

#23

投稿記事 by non » 16年前

>   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:ファイル操作

#24

投稿記事 by しょしょしょしんしゃ » 16年前

> 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);
	}
だけ でよろしいのですか?
これでは うまくいきませんでしたが・・・・。
他の部分 も 間違えている可能性が あるので 調べてみます。

non

Re:ファイル操作

#25

投稿記事 by non » 16年前

>この部分をなくして
全部なくしてどうするの?

しょしょしょしんしゃ

Re:ファイル操作

#26

投稿記事 by しょしょしょしんしゃ » 16年前

> 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時間考えましたが、わかりません・・・。
 ヒントを もらえませんか・・・

non

Re:ファイル操作

#27

投稿記事 by non » 16年前

> 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:ファイル操作

#28

投稿記事 by しょしょしょしんしゃ » 16年前

>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:ファイル操作

#29

投稿記事 by しょしょしょしんしゃ » 16年前

#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:ファイル操作

#30

投稿記事 by しょしょしょしんしゃ » 16年前

あと
この問題には 続きがありまして
この15人の点数を読み込んで、
各々 平均点を出すというのもわからないので、
そちらも
お願いします。

しょしょしょしんしゃ

Re:ファイル操作

#31

投稿記事 by しょしょしょしんしゃ » 16年前

すいません
まだ 解決していません
お願いします

組木紙織

Re:ファイル操作

#32

投稿記事 by 組木紙織 » 16年前

ソースコードだけみて考えていませんか?
まずは自分がやりたいことを日本語で書く。
次に出来るだけ詳しく(C言語の雰囲気で)日本語で書く
コードを書くのはそれからです。

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



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

kazuoni

Re:ファイル操作

#33

投稿記事 by kazuoni » 16年前

組木紙織さんのおっしゃる通り、おそらくまだ考えが浅いと思います。

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

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

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

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

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

閉鎖

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