ファイルの読み込み書き込み

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

Re:ファイルの読み込み書き込み

#101

投稿記事 by み~ » 18年前

解決できました!!コンパイル実行もできました。ファイルにはhelloと書き込まれていました!!
バイナリファイルなのに、helloと書き込まれてていいのでしょうか?普通だったら、数字とかで書き込まれて
いるはずだと思うのですが。ちなみに、バイナリエディタというものはもっていないので普通のメモ帳を使用しています。

miyaza

Re:ファイルの読み込み書き込み

#102

投稿記事 by miyaza » 18年前

68 65 6C 6C 6F 00 このように書き込まれています。何を意味しているか分かりますか?

み~

Re:ファイルの読み込み書き込み

#103

投稿記事 by み~ » 18年前

文字コードですか?

miyaza

Re:ファイルの読み込み書き込み

#104

投稿記事 by miyaza » 18年前

> 文字コードですか?
そうです。

68がhを65がeをという感じになっています。(16進数です)
それをテキストファイルでは68をhという感じで解釈して表示しています。だからバイナリファイル形式で書き込んでもテキストファイルで開くと文字として出てきます。

み~

Re:ファイルの読み込み書き込み

#105

投稿記事 by み~ » 18年前

なるほど!!!!

今度は、今書き込んだものをランダムアクセスで一文字だけ取り出そうとしています。
#include <stdio.h>

int main(void) {
	char ch[6];

	FILE *fp;
	fp = fopen("test.txt","rb");
	if(fp == NULL) {
		return 1;
	}else{
		printf("open\n");
	}

	fseek(fp,2,SEEK_SET);
	fread(&ch[6],sizeof(ch[6]),1,fp);

	printf("%s\n",ch);

	fclose(fp);
	return 0;
}
読み取ると、フフフフフフとでてきてしまいますね。。

み~

Re:ファイルの読み込み書き込み

#106

投稿記事 by み~ » 18年前

char形って1バイトですよね??
文字は2バイトになるのですか?

み~

Re:ファイルの読み込み書き込み

#107

投稿記事 by み~ » 18年前

これでやったら h と出力されました。
#include <stdio.h>

int main(void) {
	char ch[2];

	FILE *fp;
	fp = fopen("test.txt","rb");
	if(fp == NULL) {
		return 1;
	}else{
		printf("open\n");
	}

	//fseek(fp,2,SEEK_SET);
	fread(&ch[2],sizeof(ch[2]),1,fp);

	printf("%c\n",ch[2]);

	fclose(fp);
	return 0;
}

み~

Re:ファイルの読み込み書き込み

#108

投稿記事 by み~ » 18年前

できましたよ!!!!!!!!やった~!!!!

miyaza

Re:ファイルの読み込み書き込み

#109

投稿記事 by miyaza » 18年前

一文字でだけ読み取りたいのならchを配列で確保する必要はないと思います。
それに合わせて各部修正すればうまくいくと思います。

ローマ字は1バイトです。しかし日本語だったりすると2バイトになります。それ以外にもローマ字を2バイトであらわして日本語などの2バイトとのずれをなくす規格があったりします。

み~

Re:ファイルの読み込み書き込み

#110

投稿記事 by み~ » 18年前

配列にする必要は確かにないですね。
仮に、3文字読み取る場合というのはどうするべきですかね??
#include <stdio.h>

int main(void) {
	char ch[2];

	FILE *fp;
	fp = fopen("test.txt","rb");
	if(fp == NULL) {
		return 1;
	}else{
		printf("open\n");
	}

	fseek(fp,2,SEEK_SET);
	fread(&ch[2],sizeof(ch[2]),1,fp);

	printf("%c\n",ch[2]);

	fclose(fp);
	return 0;
}
このコードを実行したところ、「l」が出力されました。つまりfseek(fp,2,SEEK_SET);は先頭2バイト目から
ch[2]の中の値を読み取れというものですよね?

じゃあ、一文字だけでなく3文字指定した位置から読み取るとすると、・・・・どうやれば。。。

miyaza

Re:ファイルの読み込み書き込み

#111

投稿記事 by miyaza » 18年前

まず3文字読み込むために配列は3つ必要ですね。
それからfseek()で読み込む位置まで移動してfread()で3文字分配列に格納してprintf()で表示します。

み~

Re:ファイルの読み込み書き込み

#112

投稿記事 by み~ » 18年前

複数文字よみとるなら、配列にしてfor()でループ使うのがいいですかね??

miyaza

Re:ファイルの読み込み書き込み

#113

投稿記事 by miyaza » 18年前

> このコードを実行したところ、「l」が出力されました。つまりfseek(fp,2,SEEK_SET);は先頭2バイト目から
ch[2]の中の値を読み取れというものですよね?

先頭2バイト目からch[2]の中の値を読み取れではなく、先頭2バイト目にファイルポインタをfseek()で移動してそれから1バイト分読み取ってそれをch[2]の中に格納しています。

あとchar ch[2]と宣言しているのでch[2]という配列はありません。実際に確保されるのはch[0]とch[1]です。

Yuki

Re:ファイルの読み込み書き込み

#114

投稿記事 by Yuki » 18年前

VC6をお使いでしたら、ファイルを開く際に「用途」を「バイナリ」にすれば
バイナリエディタとして見れますよ。

フリーソフトでよければ「Stirling」というソフトがおススメです。
http://www.vector.co.jp/soft/win95/util/se079072.html

み~

Re:ファイルの読み込み書き込み

#115

投稿記事 by み~ » 18年前

できました!!!3文字読み込み成功です!!!!「llo」とでてきました。
 
h e l l o
2バイト目に移動ということはeのところに移動してそこから読み込みを始めたということになるの??
このへんがよく分からなくなる・・・・。
#include <stdio.h>

int main(void) {
	int i;
	char ch[3];


	FILE *fp;
	fp = fopen("test.txt","rb");
	if(fp == NULL) {
		return 1;
	}else{
		printf("open\n");
	}

	fseek(fp,2,SEEK_SET);

	for( i = 0; i < 3; i++){
		fread(&ch,sizeof(ch),1,fp);
	}
	
	for(i = 0; i < 3; i++){
		printf("%c\n",ch);
	}
	
	fclose(fp);
	return 0;
}

miyaza

Re:ファイルの読み込み書き込み

#116

投稿記事 by miyaza » 18年前

> 複数文字よみとるなら、配列にしてfor()でループ使うのがいいですかね??
とりあえず書いてみましょう。

miyaza

Re:ファイルの読み込み書き込み

#117

投稿記事 by miyaza » 18年前

2バイト目からというかファイルの先頭から2バイト進んだところからの読み込みです。
hが先頭で0なのでそこから1バイト先がe2バイト先がlとなっています。


むつ

Re:ファイルの読み込み書き込み

#119

投稿記事 by むつ » 18年前

現在のファイルポインタの位置を知りたいのであれば、ftell()を使います。
その前に、変数posを追加してください。※int型ではなくlong型です。
long pos;
fseek()の辺りに以下の行を追加してみてください。
これで、現在のファイルポインタの位置が変数posに格納され、なおかつ画面に表示されます。
ついでに、fseekのエラーチェックも追加しておきました。(fseekの戻り値 ok:0, error:-1 )
printf( "now pos > %ld\n", pos = ftell( fp ) );
if( fseek(fp,2,SEEK_SET) )
  printf( "seekできません\n" );
printf( "now pos > %ld\n", pos = ftell( fp ) );

み~

Re:ファイルの読み込み書き込み

#120

投稿記事 by み~ » 18年前

正しく読み込めていない・・・
テキストファイルには
1111

yamada

102222

suzuki

20

となっているのに、実際に読み込んでコンソールに出力させると、
NO:1111
NAME:yamada
yaer:102222
NO:suzuki
NAME:20
yare:-8589589というようにずれてしまったのだ。。
//書き込み用コード

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

struct seiseki {
	char no[10];
	char name[20];
	int year;
};

int main(void) {
	struct seiseki student[2];
	int i;
	char buf[20];
	FILE *fp;

	fp = fopen("student.txt","w");
	if(fp == NULL) {
		return 1;
	}else{
		printf("open\n");
	}

	for(i = 0; i < 2; i++) {
		printf("%d人目\n", i + 1);
		printf("NO:");
		fgets(student.no,sizeof(student.no),stdin);
		printf("NAME:");
		fgets(student.name,sizeof(student.name),stdin);
		printf("年齢:");
		fgets(buf,sizeof(buf),stdin);
		student.year = atoi(buf);
	}

	for(i = 0; i < 2; i++) {
		fprintf(fp,"%s\n",student.no);
		fprintf(fp,"%s\n",student.name);
		fprintf(fp,"%d\n",student.year);
	}

	printf("書き込み終了\n");

	fclose(fp);
	return 0;
}
//読み込み用コード
#include <stdio.h> 
#include <string.h>

struct seiseki {
	char no[10];
	char name[20];
	int year;
};

int main(void) {
	struct seiseki student[2];
	int i;

	FILE *fp;
	fp = fopen("student.txt","r");
	if(fp == NULL) {
		return 1;
	}else{
		printf("open\n");
	}

	for(i = 0; i < 2; i++) {
		fscanf(fp, "%s",&student.no);
		fscanf(fp, "%s",&student.name);
		fscanf(fp, "%d",&student[i].year);
	}

	for(i = 0; i < 2; i++) {
		printf("%d人\n",i + 1);
		printf("NO:%s\n",student[i].no);
		printf("NAME:%s\n",student[i].name);
		printf("year:%d\n",student[i].year);
	}

	fclose(fp);

	return 0;
}

どこでまちがえているのだろ??

miyaza

Re:ファイルの読み込み書き込み

#121

投稿記事 by miyaza » 18年前

テキストファイルの方に二人目のNOが無いからです。

み~

Re:ファイルの読み込み書き込み

#122

投稿記事 by み~ » 18年前

一体どういうことでしょう??
コンソールからは確かに書き込んでいるのですが・・・

miyaza

Re:ファイルの読み込み書き込み

#123

投稿記事 by miyaza » 18年前

102222
ではなく

10
2222
としたかったのですか?

私のほうでは、正常に書き込まれて正常に読み込むこともできましたが。

み~

Re:ファイルの読み込み書き込み

#124

投稿記事 by み~ » 18年前

できました!!!!!!

今度はこれをバイナリ形式で保存してみてランダムアクセスで特定の文字を出力させてみたいと思う
のですが、ちょっと難しいですかね??

keichan

Re:ファイルの読み込み書き込み

#125

投稿記事 by keichan » 18年前

>今度はこれをバイナリ形式で保存してみてランダムアクセスで特定の文字を出力させてみたいと思う
のですが、ちょっと難しいですかね??
いいえ、今までのやり取りの中で必要な知識は全て出ています。
try and error でやってみてください。

み~

Re:ファイルの読み込み書き込み

#126

投稿記事 by み~ » 18年前

keichanさん了解です!!!
今、苦戦中!!!

み~

Re:ファイルの読み込み書き込み

#127

投稿記事 by み~ » 18年前

コードはできてコンパイルもできていますが、正確に読み取れていないです。。

[/pre]
#include <stdio.h>
#include <string.h>
#include <stdlib.h>

struct seiseki {
char no[10];
char name[20];
int year;
};

int main(void) {
struct seiseki student[2];
int i;
char buf[20];
FILE *fp;

fp = fopen("student.txt","rb");
if(fp == NULL) {
return 1;
}else{
printf("open\n");
}

fseek(fp,0,SEEK_SET);
fread(&student[1].name,sizeof(student[1].name),1,fp);

printf("%s",student[1].name);

fclose(fp);
return 0;
}
[/pre]

open
1111

10
フフフフフフ■↑とコンソールにでてきてしまう・・・

yamada

miyaza

Re:ファイルの読み込み書き込み

#128

投稿記事 by miyaza » 18年前

書き込みソースを教えて下さい。

み~

Re:ファイルの読み込み書き込み

#129

投稿記事 by み~ » 18年前

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

struct seiseki {
	char no[10];
	char name[20];
	int year;
};

int main(void) {
	struct seiseki student[2];
	int i;
	char buf[20];
	FILE *fp;

	fp = fopen("student.txt","wb");
	if(fp == NULL) {
		return 1;
	}else{
		printf("open\n");
	}

	for(i = 0; i < 2; i++) {
		printf("%d人目\n", i + 1);
		printf("NO:");
		fgets(student.no,sizeof(student.no),stdin);
		printf("NAME:");
		fgets(student.name,sizeof(student.name),stdin);
		printf("年齢:");
		fgets(buf,sizeof(buf),stdin);
		student.year = atoi(buf);
	}

	for(i = 0; i < 2; i++) {
		fprintf(fp,"%s\n",student.no);
		fprintf(fp,"%s\n",student.name);
		fprintf(fp,"%d\n",student.year);
	}

	printf("書き込み終了\n");

	fclose(fp);
	return 0;
}

これです。

むつ

Re:ファイルの読み込み書き込み

#130

投稿記事 by むつ » 18年前

Date: 2007/03/19(月) 14:03 の書き込み用コードにある
student.year = atoi(buf);
の直後に
student[ i ].no[   strlen( student[ i ].no   ) - 1 ] = '\0';
student[ i ].name[ strlen( student[ i ].name ) - 1 ] = '\0';
を追加してください。
これで、余計な改行が消えると思います。

み~

Re:ファイルの読み込み書き込み

#131

投稿記事 by み~ » 18年前

やっぱりむりですね~

miyaza

Re:ファイルの読み込み書き込み

#132

投稿記事 by miyaza » 18年前

読み込み時にstudent[1].nameの中に取り込んでますがなぜですか?
これだと、20バイト分student[1].nameのなかに詰め込まれて出力されています。もう少しやり方があると思うのでがんばって下さい。しかし今回は読み出すデータのサイズが不特定なので大変かもしれませんが。


み~

Re:ファイルの読み込み書き込み

#134

投稿記事 by み~ » 18年前

ヒントがほしいです。。

み~

Re:ファイルの読み込み書き込み

#135

投稿記事 by み~ » 18年前

うまくいかないです・・・・・・。

miyaza

Re:ファイルの読み込み書き込み

#136

投稿記事 by miyaza » 18年前

データの構造を考え書き込み部分から見直していくべきです。

み~

Re:ファイルの読み込み書き込み

#137

投稿記事 by み~ » 18年前

書き込み部分からですか!!!!

miyaza

Re:ファイルの読み込み書き込み

#138

投稿記事 by miyaza » 18年前

まあただ読み取って表示するだけなら下みたいなやつでもいいのかもしれませんが。
#include <stdio.h> 

struct seiseki { 
char no[10]; 
char name[20]; 
char year[10]; 
}; 

int main(void) { 
	struct seiseki student[2]; 
	FILE *fp; 
	int i;

	fp = fopen("student.txt","rb"); 
	if(!fp) return 1;
	else printf("open\n");

	for(i=0;i<2;i++){
		fscanf(fp,"%s",student[0].no);
		fscanf(fp,"%s",student[0].name);
		fscanf(fp,"%s",student[0].year);
		printf("%s\n",student[0].no); 
		printf("%s\n",student[0].name); 
		printf("%s\n",student[0].year); 
		printf("\n");
	}

	fclose(fp); 
	return 0; 
}
かなりいいかげんですが・・・

どうしたらデータを管理しやすくなるか考えてみるのも大事だとおもいます。

miyaza

Re:ファイルの読み込み書き込み

#139

投稿記事 by miyaza » 18年前

間違えましたstudent[0]の部分studentです。

み~

Re:ファイルの読み込み書き込み

#140

投稿記事 by み~ » 18年前

どうしてもランダムでやりたいのです・・・。

miyaza

Re:ファイルの読み込み書き込み

#141

投稿記事 by miyaza » 18年前

では、何バイトを境にデータが入っているのか分からなければなりませんね。

み~

Re:ファイルの読み込み書き込み

#142

投稿記事 by み~ » 18年前

わけ分からなくなってきました。

jみ~

Re:ファイルの読み込み書き込み

#143

投稿記事 by jみ~ » 18年前

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

struct seiseki {
	char no[10];
	char name[20];
	int year;
};

int main(void) {
	struct seiseki student[2];
	//int i;
	//char buf[20];
	FILE *fp;

	fp = fopen("student.txt","rb");
	if(fp == NULL) {
		return 1;
	}else{
		printf("open\n");
	}

	fseek(fp,0*(sizeof(student[0])),SEEK_SET);
	fread(&student[0].name,sizeof(student[0].name),1,fp);

	printf("%s",student[0].name);

	fclose(fp);
	return 0;
}
これでもだめでした。。

miyaza

Re:ファイルの読み込み書き込み

#144

投稿記事 by miyaza » 18年前

> fseek(fp,0*(sizeof(student[0])),SEEK_SET);
0に何をかけても0にしかならないとおもいますが。

keichan

Re:ファイルの読み込み書き込み

#145

投稿記事 by keichan » 18年前

ファイルの読み書き云々より、言語としての基礎が不足しているのがヒシヒシと感じてきます。
良い書籍をお持ちでないのであれば
http://homepage3.nifty.com/mmgames/c_guide/index.html
の第1部の全ての練習問題を解き、解説を読んで理解を深めてみてください。

箸の持ち方を知らない人に箸で豆を掴めといっても無理な話なので
じっくりと基礎を固めて下さい。

むつ

Re:ファイルの読み込み書き込み

#146

投稿記事 by むつ » 18年前

 これまで経験したように、データファイルの中身がいつも変わるようだと、
その都度、プログラム全体を修正しなくてはいけなくなりますよね。
ですから、真っ先にデータファイルのルールを決めましょう。

 ・NOは数値のみか。何桁にするか。
 ・NAMEは記号や日本語を除くのか。何桁にするか。
 ・他にどんなデータをどんなルールで追加するのか。
 ・そして、一人分のデータを一行または、木構造で表すようにしませんか?


 極端な事を言えば、【プログラム】は手段で【データ】は財産かなと。
【データ】にルールを設けると、他の言語でも再利用できますよ。

み~

Re:ファイルの読み込み書き込み

#147

投稿記事 by み~ » 18年前

コンパイルエラーはないけど、やっぱり読み取れない・・・・

み~

Re:ファイルの読み込み書き込み

#148

投稿記事 by み~ » 18年前

どうしても読み取りたい。。。

miyaza

Re:ファイルの読み込み書き込み

#149

投稿記事 by miyaza » 18年前

参考になるとは思えませんが、ソースを書いてみました。
読み込み部分では、一人目の人のNAMEだけを取得して表示しています。
何をどう書き込んでデータの中はどうなっているのか分からないと読み込みもできないと思います。

書き込みソース
#include <stdio.h>

#define NUM 2
typedef struct sdata{
	int no;
	char name[24];
	int year;
}sdata;

int main(){
	FILE *fp;
	sdata ss[NUM];
	int i;
	char buf[8];

	fp=fopen("test.dat","wb");
	if(!fp){
		printf("ファイルオープンエラー");
		return 1;
	}

	for(i=0;i<NUM;i++){
		printf("%d人目の入力\n",i+1);
		printf("NO:>>");
		fgets(buf,sizeof(buf),stdin);
		rewind(stdin);
		sscanf(buf,"%d",&ss.no);
		printf("NAME:>>");
		fgets(buf,sizeof(ss.name),stdin);
		rewind(stdin);
		sscanf(buf,"%s",ss.name);
		printf("year:>>");
		fgets(buf,sizeof(buf),stdin);
		rewind(stdin);
		sscanf(buf,"%d",&ss.year);
	}
	fwrite(ss,sizeof(ss),1,fp);
	
	fclose(fp);
	return 0;
}


読み込みソース
#include <stdio.h>

#define NUM 2
typedef struct sdata{
	int no;
	char name[24];
	int year;
}sdata;

int main(){
	FILE *fp;
	sdata ss[NUM];

	fp=fopen("test.dat","rb");
	if(!fp){
		printf("ファイルオープンエラー");
		return 1;
	}
	fseek(fp,4,SEEK_SET);
	fread(ss[0].name,sizeof(ss[0].name),1,fp);
	printf("%s\n",ss[0].name);
	return 0;
}

み~

Re:ファイルの読み込み書き込み

#150

投稿記事 by み~ » 18年前

miyazaさんありがとうございます!!参考にして考えてみます!!

むつ

Re:ファイルの読み込み書き込み

#151

投稿記事 by むつ » 18年前

printf("%s",student[0].name);
上を下に変えて、今のポインタの位置と取ってきたデータを
ftell()で確認しながらソースを修正して下さい。
printf( "NOW FP-->%ld %s\n", ftell( fp ), student[0].name );

み~

Re:ファイルの読み込み書き込み

#152

投稿記事 by み~ » 18年前

miyazaさんへ。
私の書いたコードと似ていますが、私とは何処が違うかわかりません。。集中がきれてしまった・・・。
混乱しすぎています。。

miyaza

Re:ファイルの読み込み書き込み

#153

投稿記事 by miyaza » 18年前

実行できましたかね?

み~

Re:ファイルの読み込み書き込み

#154

投稿記事 by み~ » 18年前

むつさんアドバイスありがとうございます。。

み~

Re:ファイルの読み込み書き込み

#155

投稿記事 by み~ » 18年前

今日は、もう一度書き込みファイルから作り直して頑張ってみたいと思います!!!

み~

Re:ファイルの読み込み書き込み

#156

投稿記事 by み~ » 18年前

おはようございます!!
miyazaさんの上のコードの中にあるrewind()は、ファイルの読み込み位置を先頭に戻すためのものですよね?
これを使うことによってどのような利点があるのでしょう?またどういう場合につかうのでしょう??
今まで私はぜんぜん使っていなかったですしね。。
後、sscanfもmiyazaさんは使っていますね。sscanf,fscanf,scanfの違いってなんでしょう??

み~

Re:ファイルの読み込み書き込み

#157

投稿記事 by み~ » 18年前

//書き込み
#include <stdio.h>
#include <stdlib.h>
#define NUM 2

struct seiseki {
	char no[10];
	char name[20];
	int year;
};

int main(void) {
	FILE *fp;
	struct seiseki student[NUM];
	int i;
	char buf[10];

	fp = fopen("student.txt","wb");
	if(fp == NULL){
		return 1;
	}else{
		printf("file open\n");
	}

	for(i = 0; i < NUM; i++) {
		printf("%d人目\n",i + 1);
		printf("NO >>");
		fgets(student.no,sizeof(student.no),stdin);
		printf("NAME >>");
		fgets(student.name,sizeof(student).name,stdin);
		printf("year >>");
		fgets(buf,sizeof(buf),stdin);
		student.year = atoi(buf);
	}
		fwrite(student,sizeof(student),1,fp);

		fclose(fp);
		return 0;
}

//読み込み
#include <stdio.h>
#include <stdlib.h>
#define NUM 2

struct seiseki {
	char no[10];
	char name[20];
	int year;
};

int main(void) {
	FILE *fp;
	struct seiseki student[NUM];
	int i;
	char buf[10];

	fp = fopen("student.txt","rb");
	if(fp == NULL){
		return 1;
	}else{
		printf("file open\n");
	}
	
	fseek(fp,4,SEEK_SET);
	fread(student[0].name,sizeof(student[0].name),1,fp);
	printf("%s\n",student[0].name);

	fclose(fp);
	return 0;
}


実行したら Aと一文字だけでてきた。。
ちょおと違う・・・・。

miyaza

Re:ファイルの読み込み書き込み

#158

投稿記事 by miyaza » 18年前

NO 10バイト
NAME 20バイト
YEAR 4バイト

一人あたりのデータの構造は上のようになっています。だから名前だけを読み込みたかったらfseek()で何バイト目から読み込めばいいでしょうか。

み~

Re:ファイルの読み込み書き込み

#159

投稿記事 by み~ » 18年前

一応できました!!!!
でも、偶然できたって感じです。。

どこに何をchar型で書いたのかint型で書いたのかという事は大事ですね。そうしないと
目的の文字とか読み取れないし。

後、書き込みに関してはfwrite(ss,sizeof(ss),1,fp);の部分って結構大事ですよね?

自分の場あい、ファイルに書き込むときはfwriteをfor文でループさせて書いていただけ
なので。

とにかく、まだまだアヤフヤナ部分が多いでうす。

私が今まで書いてきたコードと、miyazaさんが書いてくれたコードの違いをしっかりと理解しないと・・。

miyaza

Re:ファイルの読み込み書き込み

#160

投稿記事 by miyaza » 18年前

> miyazaさんの上のコードの中にあるrewind()は、ファイルの読み込み位置を先頭に戻すためのものですよね?
これを使うことによってどのような利点があるのでしょう?またどういう場合につかうのでしょう??

fgest()で入力していますが入力できる量を24バイトとしています。しかしそれを超えた量を入力しようとすると次の入力処理が正常に動作しません。それを防ぐためにrewind()を使って入力バッファをクリアしています。

み~

Re:ファイルの読み込み書き込み

#161

投稿記事 by み~ » 18年前

miyazaさんおはようございます。

なんとかできましたが、まだまだダメですね。。

char buf[8]と宣言していますが、これをなんのために宣言したのかちょっと分からないですね。。
fwrite(ss,sizeof(ss),1,fp);の部分って結構大事ですよね?

miyaza

Re:ファイルの読み込み書き込み

#162

投稿記事 by miyaza » 18年前

> char buf[8]と宣言していますが、これをなんのために宣言したのかちょっと分からないですね。。
fgetsで読み込むのは文字列なので、いったんbufにいれてそれからsscanf()で整数を取り出して構造体に格納しています。

> fwrite(ss,sizeof(ss),1,fp)
はい。大事です。これが無ければ書き込めません。

み~

Re:ファイルの読み込み書き込み

#163

投稿記事 by み~ » 18年前

> fwrite(ss,sizeof(ss),1,fp)
>はい。大事です。これが無ければ書き込めません。

確かにその通りですが引数部分のことだったのですが・・・。

miyaza

Re:ファイルの読み込み書き込み

#164

投稿記事 by miyaza » 18年前

まず構造体
sdata ss[NUM];
と構造体を配列で宣言しています。

fwrite(ss,sizeof(ss),1,fp)

第一引数 ss これは構造体の配列の先頭アドレスを示しています。
第二引数 sizeof(ss) これは構造体配列のサイズです。したがって今回は(4+24+4)*2だから64バイトです。
第三引数 1 一回書き込みます。
第四引数 fp 書き込み先のポインタです。

miyaza

Re:ファイルの読み込み書き込み

#165

投稿記事 by miyaza » 18年前

だから書き変えるとしたら

for(i=0;i<NUM;i++){
fwrite(&ss,sizeof(ss),1,fp);
}

こんな感じでしょうか。

しかしこのやり方よりも
fwrite(ss,sizeof(ss),1,fp)
とした方がスマートだと思います。

み~

Re:ファイルの読み込み書き込み

#166

投稿記事 by み~ » 18年前

miyazaさん毎回アドバイス&解説ありがとうございます!!

一つ目の構造体の人の名前は取り出せましたが、二つ目の構造体の人の
名前がうまく取り出せないですね。
fread(student[1].name,sizeof(student[1].name),1,fp);
printf("%s\n",student[1].name);としたのですけど。これではダメかな? ^^;

miyaza

Re:ファイルの読み込み書き込み

#167

投稿記事 by miyaza » 18年前

fseek()の部分はどうしましたか?

み~

Re:ファイルの読み込み書き込み

#168

投稿記事 by み~ » 18年前

fseek(fp,10,SEEK_SET);
最初のヤツを読み込んだときのままです。。

miyaza

Re:ファイルの読み込み書き込み

#169

投稿記事 by miyaza » 18年前

それではファイルポインタの位置が一人目を読み込んだときと変わりません。
データは下のように入っています。

NO NAME YEAR NO NAME YEAR

と続けて二人分入っています。

だから二人目の名前にアクセスするにはfseek()をどう書き換えるか、考えて下さい。

10バイト20バイト4バイト10バイト20バイト4バイト


み~

Re:ファイルの読み込み書き込み

#171

投稿記事 by み~ » 18年前

できました!!読み込み成功す!!ひとつの構造体のサイスをsizeof()で求めました。

み~

Re:ファイルの読み込み書き込み

#172

投稿記事 by み~ » 18年前

//書き込みコード
#include <stdio.h>
#include <stdlib.h>
#define NUM 2

struct seiseki {
	char no[10];
	char name[20];
	int year;
};

int main(void) {
	FILE *fp;
	struct seiseki student[NUM];
	int i;
	char buf[10];

	fp = fopen("student.txt","wb");
	if(fp == NULL){
		return 1;
	}else{
		printf("file open\n");
	}

	for(i = 0; i < NUM; i++) {
		printf("%d人目\n",i + 1);
		printf("NO >>");
		fgets(student.no,sizeof(student.no),stdin);
		printf("NAME >>");
		fgets(student.name,sizeof(student).name,stdin);
		printf("year >>");
		fgets(buf,sizeof(buf),stdin);
		student.year = atoi(buf);
	}
		fwrite(student,sizeof(student),1,fp);

		fclose(fp);
		return 0;
}
//読み込みコード
#include <stdio.h>
#include <stdlib.h>
#define NUM 2

struct seiseki {
	char no[10];
	char name[20];
	int year;
};

int main(void) {
	FILE *fp;
	struct seiseki student[NUM];
	//int i;
	//char buf[10];

	fp = fopen("student.txt","rb");
	if(fp == NULL){
		return 1;
	}else{
		printf("file open\n");
	}
	
	fseek(fp,10,SEEK_SET);
	fread(student[1].name,sizeof(student[1].name),1,fp);
	printf("%s\n",student[1].name);
	printf("%d",sizeof(student[0]));
	fclose(fp);
	return 0;
}


fseek()の10のところを変えてやれば、確かに二つ目の構造体の名前部分を読み取れますが、
名前だけではなく、NOもfseekの中の数字を変えてやれば読み取れてしまいます。
せっかく、fread()のなかでstudent[/url].nameなどとしてるのになぜ??

miyaza

Re:ファイルの読み込み書き込み

#173

投稿記事 by miyaza » 18年前

student.nameは、ただの入れ物です。
読み取ろうと思えば何でも読み取れます。

み~

Re:ファイルの読み込み書き込み

#174

投稿記事 by み~ » 18年前

fseek(fp,1,SEEK_SET)とするとNO部分が読み取れてしまいます。
fread()でnameにしているのに・・・・・。確かに、fseek()で名前のところに持っていけば名前
もしっかり読み込めるのですが・・・・。nameのところに全部読み込んだものを入れてる感じになっちゃて
ますね^.^;

み~

Re:ファイルの読み込み書き込み

#175

投稿記事 by み~ » 18年前

>>student.nameは、ただの入れ物です。
読み取ろうと思えば何でも読み取れます。

そうですか。。それなら別に、student.nameとしなくても、name部分はなんでもいいのですか??

miyaza

Re:ファイルの読み込み書き込み

#176

投稿記事 by miyaza » 18年前

データの読み込みならこんなこともできます。

fread(student,sizeof(student),1,fp);

こうすることで構造体に綺麗にデータが入ります。

printf("%s\n"student[0].no);

と表示できます。

freadで読み込みこんでstudent[0].nameと指定したからといって読み込んだバイナリの情報がstudent[0].nameのデータかどうか判断して読み込むなんてことはfread()に不可能です。
ただ指定されたところから指定されたところにデータを指定された分だけ詰め込むだけです。

miyaza

Re:ファイルの読み込み書き込み

#177

投稿記事 by miyaza » 18年前

> そうですか。。それなら別に、student.nameとしなくても、name部分はなんでもいいのですか??
そうです。

char buf[20];

fread(buf,sizeof(buf),1,fp);

とすることも可能です。

み~

Re:ファイルの読み込み書き込み

#178

投稿記事 by み~ » 18年前

なんとなく分かってきた気がします。。

閉鎖

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