ファイルの読み込み書き込み
-
み~
Re:ファイルの読み込み書き込み
解決できました!!コンパイル実行もできました。ファイルにはhelloと書き込まれていました!!
バイナリファイルなのに、helloと書き込まれてていいのでしょうか?普通だったら、数字とかで書き込まれて
いるはずだと思うのですが。ちなみに、バイナリエディタというものはもっていないので普通のメモ帳を使用しています。
バイナリファイルなのに、helloと書き込まれてていいのでしょうか?普通だったら、数字とかで書き込まれて
いるはずだと思うのですが。ちなみに、バイナリエディタというものはもっていないので普通のメモ帳を使用しています。
-
miyaza
Re:ファイルの読み込み書き込み
> 文字コードですか?
そうです。
68がhを65がeをという感じになっています。(16進数です)
それをテキストファイルでは68をhという感じで解釈して表示しています。だからバイナリファイル形式で書き込んでもテキストファイルで開くと文字として出てきます。
そうです。
68がhを65がeをという感じになっています。(16進数です)
それをテキストファイルでは68をhという感じで解釈して表示しています。だからバイナリファイル形式で書き込んでもテキストファイルで開くと文字として出てきます。
-
み~
Re:ファイルの読み込み書き込み
なるほど!!!!
今度は、今書き込んだものをランダムアクセスで一文字だけ取り出そうとしています。
今度は、今書き込んだものをランダムアクセスで一文字だけ取り出そうとしています。
#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:ファイルの読み込み書き込み
これでやったら 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;
}-
miyaza
Re:ファイルの読み込み書き込み
一文字でだけ読み取りたいのならchを配列で確保する必要はないと思います。
それに合わせて各部修正すればうまくいくと思います。
ローマ字は1バイトです。しかし日本語だったりすると2バイトになります。それ以外にもローマ字を2バイトであらわして日本語などの2バイトとのずれをなくす規格があったりします。
それに合わせて各部修正すればうまくいくと思います。
ローマ字は1バイトです。しかし日本語だったりすると2バイトになります。それ以外にもローマ字を2バイトであらわして日本語などの2バイトとのずれをなくす規格があったりします。
-
み~
Re:ファイルの読み込み書き込み
配列にする必要は確かにないですね。
仮に、3文字読み取る場合というのはどうするべきですかね??
ch[2]の中の値を読み取れというものですよね?
じゃあ、一文字だけでなく3文字指定した位置から読み取るとすると、・・・・どうやれば。。。
仮に、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:ファイルの読み込み書き込み
まず3文字読み込むために配列は3つ必要ですね。
それからfseek()で読み込む位置まで移動してfread()で3文字分配列に格納してprintf()で表示します。
それからfseek()で読み込む位置まで移動してfread()で3文字分配列に格納してprintf()で表示します。
-
miyaza
Re:ファイルの読み込み書き込み
> このコードを実行したところ、「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]です。
ch[2]の中の値を読み取れというものですよね?
先頭2バイト目からch[2]の中の値を読み取れではなく、先頭2バイト目にファイルポインタをfseek()で移動してそれから1バイト分読み取ってそれをch[2]の中に格納しています。
あとchar ch[2]と宣言しているのでch[2]という配列はありません。実際に確保されるのはch[0]とch[1]です。
-
Yuki
Re:ファイルの読み込み書き込み
VC6をお使いでしたら、ファイルを開く際に「用途」を「バイナリ」にすれば
バイナリエディタとして見れますよ。
フリーソフトでよければ「Stirling」というソフトがおススメです。
http://www.vector.co.jp/soft/win95/util/se079072.html
バイナリエディタとして見れますよ。
フリーソフトでよければ「Stirling」というソフトがおススメです。
http://www.vector.co.jp/soft/win95/util/se079072.html
-
み~
Re:ファイルの読み込み書き込み
できました!!!3文字読み込み成功です!!!!「llo」とでてきました。
h e l l o
2バイト目に移動ということはeのところに移動してそこから読み込みを始めたということになるの??
このへんがよく分からなくなる・・・・。
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:ファイルの読み込み書き込み
2バイト目からというかファイルの先頭から2バイト進んだところからの読み込みです。
hが先頭で0なのでそこから1バイト先がe2バイト先がlとなっています。
hが先頭で0なのでそこから1バイト先がe2バイト先がlとなっています。
-
むつ
Re:ファイルの読み込み書き込み
現在のファイルポインタの位置を知りたいのであれば、ftell()を使います。
その前に、変数posを追加してください。※int型ではなくlong型です。
これで、現在のファイルポインタの位置が変数posに格納され、なおかつ画面に表示されます。
ついでに、fseekのエラーチェックも追加しておきました。(fseekの戻り値 ok:0, error:-1 )
その前に、変数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:ファイルの読み込み書き込み
正しく読み込めていない・・・
テキストファイルには
1111
yamada
102222
suzuki
20
となっているのに、実際に読み込んでコンソールに出力させると、
NO:1111
NAME:yamada
yaer:102222
NO:suzuki
NAME:20
yare:-8589589というようにずれてしまったのだ。。
どこでまちがえているのだろ??
テキストファイルには
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;
}どこでまちがえているのだろ??
-
み~
Re:ファイルの読み込み書き込み
できました!!!!!!
今度はこれをバイナリ形式で保存してみてランダムアクセスで特定の文字を出力させてみたいと思う
のですが、ちょっと難しいですかね??
今度はこれをバイナリ形式で保存してみてランダムアクセスで特定の文字を出力させてみたいと思う
のですが、ちょっと難しいですかね??
-
keichan
Re:ファイルの読み込み書き込み
>今度はこれをバイナリ形式で保存してみてランダムアクセスで特定の文字を出力させてみたいと思う
のですが、ちょっと難しいですかね??
いいえ、今までのやり取りの中で必要な知識は全て出ています。
try and error でやってみてください。
のですが、ちょっと難しいですかね??
いいえ、今までのやり取りの中で必要な知識は全て出ています。
try and error でやってみてください。
-
み~
Re:ファイルの読み込み書き込み
コードはできてコンパイルもできていますが、正確に読み取れていないです。。
[/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
[/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
-
み~
Re:ファイルの読み込み書き込み
#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:ファイルの読み込み書き込み
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'; を追加してください。 これで、余計な改行が消えると思います。
-
miyaza
Re:ファイルの読み込み書き込み
読み込み時にstudent[1].nameの中に取り込んでますがなぜですか?
これだと、20バイト分student[1].nameのなかに詰め込まれて出力されています。もう少しやり方があると思うのでがんばって下さい。しかし今回は読み出すデータのサイズが不特定なので大変かもしれませんが。
これだと、20バイト分student[1].nameのなかに詰め込まれて出力されています。もう少しやり方があると思うのでがんばって下さい。しかし今回は読み出すデータのサイズが不特定なので大変かもしれませんが。
-
miyaza
Re:ファイルの読み込み書き込み
まあただ読み取って表示するだけなら下みたいなやつでもいいのかもしれませんが。
どうしたらデータを管理しやすくなるか考えてみるのも大事だとおもいます。
#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;
}
かなりいいかげんですが・・・どうしたらデータを管理しやすくなるか考えてみるのも大事だとおもいます。
-
jみ~
Re:ファイルの読み込み書き込み
#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:ファイルの読み込み書き込み
> fseek(fp,0*(sizeof(student[0])),SEEK_SET);
0に何をかけても0にしかならないとおもいますが。
0に何をかけても0にしかならないとおもいますが。
-
keichan
Re:ファイルの読み込み書き込み
ファイルの読み書き云々より、言語としての基礎が不足しているのがヒシヒシと感じてきます。
良い書籍をお持ちでないのであれば
http://homepage3.nifty.com/mmgames/c_guide/index.html
の第1部の全ての練習問題を解き、解説を読んで理解を深めてみてください。
箸の持ち方を知らない人に箸で豆を掴めといっても無理な話なので
じっくりと基礎を固めて下さい。
良い書籍をお持ちでないのであれば
http://homepage3.nifty.com/mmgames/c_guide/index.html
の第1部の全ての練習問題を解き、解説を読んで理解を深めてみてください。
箸の持ち方を知らない人に箸で豆を掴めといっても無理な話なので
じっくりと基礎を固めて下さい。
-
むつ
Re:ファイルの読み込み書き込み
これまで経験したように、データファイルの中身がいつも変わるようだと、
その都度、プログラム全体を修正しなくてはいけなくなりますよね。
ですから、真っ先にデータファイルのルールを決めましょう。
・NOは数値のみか。何桁にするか。
・NAMEは記号や日本語を除くのか。何桁にするか。
・他にどんなデータをどんなルールで追加するのか。
・そして、一人分のデータを一行または、木構造で表すようにしませんか?
極端な事を言えば、【プログラム】は手段で【データ】は財産かなと。
【データ】にルールを設けると、他の言語でも再利用できますよ。
その都度、プログラム全体を修正しなくてはいけなくなりますよね。
ですから、真っ先にデータファイルのルールを決めましょう。
・NOは数値のみか。何桁にするか。
・NAMEは記号や日本語を除くのか。何桁にするか。
・他にどんなデータをどんなルールで追加するのか。
・そして、一人分のデータを一行または、木構造で表すようにしませんか?
極端な事を言えば、【プログラム】は手段で【データ】は財産かなと。
【データ】にルールを設けると、他の言語でも再利用できますよ。
-
miyaza
Re:ファイルの読み込み書き込み
参考になるとは思えませんが、ソースを書いてみました。
読み込み部分では、一人目の人のNAMEだけを取得して表示しています。
何をどう書き込んでデータの中はどうなっているのか分からないと読み込みもできないと思います。
書き込みソース
読み込みソース
読み込み部分では、一人目の人の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:ファイルの読み込み書き込み
printf("%s",student[0].name);
上を下に変えて、今のポインタの位置と取ってきたデータを
ftell()で確認しながらソースを修正して下さい。
printf( "NOW FP-->%ld %s\n", ftell( fp ), student[0].name );-
み~
Re:ファイルの読み込み書き込み
おはようございます!!
miyazaさんの上のコードの中にあるrewind()は、ファイルの読み込み位置を先頭に戻すためのものですよね?
これを使うことによってどのような利点があるのでしょう?またどういう場合につかうのでしょう??
今まで私はぜんぜん使っていなかったですしね。。
後、sscanfもmiyazaさんは使っていますね。sscanf,fscanf,scanfの違いってなんでしょう??
miyazaさんの上のコードの中にあるrewind()は、ファイルの読み込み位置を先頭に戻すためのものですよね?
これを使うことによってどのような利点があるのでしょう?またどういう場合につかうのでしょう??
今まで私はぜんぜん使っていなかったですしね。。
後、sscanfもmiyazaさんは使っていますね。sscanf,fscanf,scanfの違いってなんでしょう??
-
み~
Re:ファイルの読み込み書き込み
//書き込み
#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:ファイルの読み込み書き込み
NO 10バイト
NAME 20バイト
YEAR 4バイト
一人あたりのデータの構造は上のようになっています。だから名前だけを読み込みたかったらfseek()で何バイト目から読み込めばいいでしょうか。
NAME 20バイト
YEAR 4バイト
一人あたりのデータの構造は上のようになっています。だから名前だけを読み込みたかったらfseek()で何バイト目から読み込めばいいでしょうか。
-
み~
Re:ファイルの読み込み書き込み
一応できました!!!!
でも、偶然できたって感じです。。
どこに何をchar型で書いたのかint型で書いたのかという事は大事ですね。そうしないと
目的の文字とか読み取れないし。
後、書き込みに関してはfwrite(ss,sizeof(ss),1,fp);の部分って結構大事ですよね?
自分の場あい、ファイルに書き込むときはfwriteをfor文でループさせて書いていただけ
なので。
とにかく、まだまだアヤフヤナ部分が多いでうす。
私が今まで書いてきたコードと、miyazaさんが書いてくれたコードの違いをしっかりと理解しないと・・。
でも、偶然できたって感じです。。
どこに何をchar型で書いたのかint型で書いたのかという事は大事ですね。そうしないと
目的の文字とか読み取れないし。
後、書き込みに関してはfwrite(ss,sizeof(ss),1,fp);の部分って結構大事ですよね?
自分の場あい、ファイルに書き込むときはfwriteをfor文でループさせて書いていただけ
なので。
とにかく、まだまだアヤフヤナ部分が多いでうす。
私が今まで書いてきたコードと、miyazaさんが書いてくれたコードの違いをしっかりと理解しないと・・。
-
miyaza
Re:ファイルの読み込み書き込み
> miyazaさんの上のコードの中にあるrewind()は、ファイルの読み込み位置を先頭に戻すためのものですよね?
これを使うことによってどのような利点があるのでしょう?またどういう場合につかうのでしょう??
fgest()で入力していますが入力できる量を24バイトとしています。しかしそれを超えた量を入力しようとすると次の入力処理が正常に動作しません。それを防ぐためにrewind()を使って入力バッファをクリアしています。
これを使うことによってどのような利点があるのでしょう?またどういう場合につかうのでしょう??
fgest()で入力していますが入力できる量を24バイトとしています。しかしそれを超えた量を入力しようとすると次の入力処理が正常に動作しません。それを防ぐためにrewind()を使って入力バッファをクリアしています。
-
み~
Re:ファイルの読み込み書き込み
miyazaさんおはようございます。
なんとかできましたが、まだまだダメですね。。
char buf[8]と宣言していますが、これをなんのために宣言したのかちょっと分からないですね。。
fwrite(ss,sizeof(ss),1,fp);の部分って結構大事ですよね?
なんとかできましたが、まだまだダメですね。。
char buf[8]と宣言していますが、これをなんのために宣言したのかちょっと分からないですね。。
fwrite(ss,sizeof(ss),1,fp);の部分って結構大事ですよね?
-
miyaza
Re:ファイルの読み込み書き込み
> char buf[8]と宣言していますが、これをなんのために宣言したのかちょっと分からないですね。。
fgetsで読み込むのは文字列なので、いったんbufにいれてそれからsscanf()で整数を取り出して構造体に格納しています。
> fwrite(ss,sizeof(ss),1,fp)
はい。大事です。これが無ければ書き込めません。
fgetsで読み込むのは文字列なので、いったんbufにいれてそれからsscanf()で整数を取り出して構造体に格納しています。
> fwrite(ss,sizeof(ss),1,fp)
はい。大事です。これが無ければ書き込めません。
-
み~
Re:ファイルの読み込み書き込み
> fwrite(ss,sizeof(ss),1,fp)
>はい。大事です。これが無ければ書き込めません。
確かにその通りですが引数部分のことだったのですが・・・。
>はい。大事です。これが無ければ書き込めません。
確かにその通りですが引数部分のことだったのですが・・・。
-
miyaza
Re:ファイルの読み込み書き込み
まず構造体
sdata ss[NUM];
と構造体を配列で宣言しています。
fwrite(ss,sizeof(ss),1,fp)
第一引数 ss これは構造体の配列の先頭アドレスを示しています。
第二引数 sizeof(ss) これは構造体配列のサイズです。したがって今回は(4+24+4)*2だから64バイトです。
第三引数 1 一回書き込みます。
第四引数 fp 書き込み先のポインタです。
sdata ss[NUM];
と構造体を配列で宣言しています。
fwrite(ss,sizeof(ss),1,fp)
第一引数 ss これは構造体の配列の先頭アドレスを示しています。
第二引数 sizeof(ss) これは構造体配列のサイズです。したがって今回は(4+24+4)*2だから64バイトです。
第三引数 1 一回書き込みます。
第四引数 fp 書き込み先のポインタです。
-
miyaza
Re:ファイルの読み込み書き込み
だから書き変えるとしたら
for(i=0;i<NUM;i++){
fwrite(&ss,sizeof(ss),1,fp);
}
こんな感じでしょうか。
しかしこのやり方よりも
fwrite(ss,sizeof(ss),1,fp)
とした方がスマートだと思います。
for(i=0;i<NUM;i++){
fwrite(&ss,sizeof(ss),1,fp);
}
こんな感じでしょうか。
しかしこのやり方よりも
fwrite(ss,sizeof(ss),1,fp)
とした方がスマートだと思います。
-
み~
Re:ファイルの読み込み書き込み
miyazaさん毎回アドバイス&解説ありがとうございます!!
一つ目の構造体の人の名前は取り出せましたが、二つ目の構造体の人の
名前がうまく取り出せないですね。
fread(student[1].name,sizeof(student[1].name),1,fp);
printf("%s\n",student[1].name);としたのですけど。これではダメかな? ^^;
一つ目の構造体の人の名前は取り出せましたが、二つ目の構造体の人の
名前がうまく取り出せないですね。
fread(student[1].name,sizeof(student[1].name),1,fp);
printf("%s\n",student[1].name);としたのですけど。これではダメかな? ^^;
-
miyaza
Re:ファイルの読み込み書き込み
それではファイルポインタの位置が一人目を読み込んだときと変わりません。
データは下のように入っています。
NO NAME YEAR NO NAME YEAR
と続けて二人分入っています。
だから二人目の名前にアクセスするにはfseek()をどう書き換えるか、考えて下さい。
10バイト20バイト4バイト10バイト20バイト4バイト
データは下のように入っています。
NO NAME YEAR NO NAME YEAR
と続けて二人分入っています。
だから二人目の名前にアクセスするにはfseek()をどう書き換えるか、考えて下さい。
10バイト20バイト4バイト10バイト20バイト4バイト
-
み~
Re:ファイルの読み込み書き込み
//書き込みコード
#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などとしてるのになぜ??
-
み~
Re:ファイルの読み込み書き込み
fseek(fp,1,SEEK_SET)とするとNO部分が読み取れてしまいます。
fread()でnameにしているのに・・・・・。確かに、fseek()で名前のところに持っていけば名前
もしっかり読み込めるのですが・・・・。nameのところに全部読み込んだものを入れてる感じになっちゃて
ますね^.^;
fread()でnameにしているのに・・・・・。確かに、fseek()で名前のところに持っていけば名前
もしっかり読み込めるのですが・・・・。nameのところに全部読み込んだものを入れてる感じになっちゃて
ますね^.^;
-
み~
Re:ファイルの読み込み書き込み
>>student.nameは、ただの入れ物です。
読み取ろうと思えば何でも読み取れます。
そうですか。。それなら別に、student.nameとしなくても、name部分はなんでもいいのですか??
読み取ろうと思えば何でも読み取れます。
そうですか。。それなら別に、student.nameとしなくても、name部分はなんでもいいのですか??
-
miyaza
Re:ファイルの読み込み書き込み
データの読み込みならこんなこともできます。
fread(student,sizeof(student),1,fp);
こうすることで構造体に綺麗にデータが入ります。
printf("%s\n"student[0].no);
と表示できます。
freadで読み込みこんでstudent[0].nameと指定したからといって読み込んだバイナリの情報がstudent[0].nameのデータかどうか判断して読み込むなんてことはfread()に不可能です。
ただ指定されたところから指定されたところにデータを指定された分だけ詰め込むだけです。
fread(student,sizeof(student),1,fp);
こうすることで構造体に綺麗にデータが入ります。
printf("%s\n"student[0].no);
と表示できます。
freadで読み込みこんでstudent[0].nameと指定したからといって読み込んだバイナリの情報がstudent[0].nameのデータかどうか判断して読み込むなんてことはfread()に不可能です。
ただ指定されたところから指定されたところにデータを指定された分だけ詰め込むだけです。
-
miyaza
Re:ファイルの読み込み書き込み
> そうですか。。それなら別に、student.nameとしなくても、name部分はなんでもいいのですか??
そうです。
char buf[20];
fread(buf,sizeof(buf),1,fp);
とすることも可能です。
そうです。
char buf[20];
fread(buf,sizeof(buf),1,fp);
とすることも可能です。