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

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

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

#1

投稿記事 by み~ » 18年前

おはようございます!!書き込みが多くなったので新たにスレをたてさせていただきます!!

毎日毎日、同じような質問に親切にアドバイスをくださる皆様にはものすごく感謝しております!!

み~

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

#2

投稿記事 by み~ » 18年前

#include <stdio.h>
#define NUM 5
int main(void) {
	char no[NUM] = {1,2,3,4,5};
	int i ;
	FILE *fp;
	fp = fopen("test.txt","w");
	if(fp == NULL){
		return 1;
	}else{
		printf("open\n");
	}

	for(i = 0; i < NUM; i++) {
		fgets(&no,sizeof(no),fp );
		
	}

	for(i = 0; i < NUM; i++) {
		fprintf(fp,"%d\n", &no);
	}
	fclose(fp);
	return 0;
}

ファイルには
1245048
1245049
1245050
1245051
1245052と書き込まれてしまっている・・・。

fgets(&no,sizeof(no),fp );の所が違うの?&を取ると警告でるし・・・・

み~

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

#3

投稿記事 by み~ » 18年前

やっぱり二次元配列にするべきなのですかね??

一次元でもできるようにしたいのですが・・・何か方法はありますか??

miyaza

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

#4

投稿記事 by miyaza » 18年前

キーボードから入力して書き込みたいのですか?
それとも配列の初期値12345を書き込みたいのですか?
後者ならばfgets()を使う必要はありません。

み~

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

#5

投稿記事 by み~ » 18年前

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

初期値を書き込みたいのです。。キーボード入力しないならfgets()はいらないと気づいてfgets()部分
をけしたのですが、ダメでした。。

miyaza

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

#6

投稿記事 by miyaza » 18年前

12345と出力されれば良いのですか?

み~

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

#7

投稿記事 by み~ » 18年前

書き込まれたファイルを見ると、意味不明な文字とかが書かれているのです・・・。

fprintf(fp,"%d\n", &no);の部分なんですけど、%dじゃなくて%sですかね。。char no[NUM]となって
いることだし・・・・。

miyaza

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

#8

投稿記事 by miyaza » 18年前

fprintf()の&を取ればおそらく大丈夫です。

み~

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

#9

投稿記事 by み~ » 18年前

>>12345と出力されれば良いのですか?
そうです・・・・。

むつ

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

#10

投稿記事 by むつ » 18年前

前日のソースでは fprintf(fp,"%d\n", &no); において
noとしていましたよね。

エディタは何をお使いでしょうか。
タイプミス防止の為、「 & 」に色を付けてみてはいかがでしょうか。

み~

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

#11

投稿記事 by み~ » 18年前

>>fprintf()の&を取ればおそらく大丈夫です。

これでできましたよ!!

でも、どうしてもコンソールから入力させて一次元でもできるようになりたいですね~。。

miyaza

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

#12

投稿記事 by miyaza » 18年前

何で一次元にこだわるのですか?
文字列を格納するなら二次元の方が管理しやすいと思います。

み~

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

#13

投稿記事 by み~ » 18年前

むつさんおはようございます!!

なんというか&の使い方がよく分からないのです。。
ポインタの所とかよんでいるのですが・・・。

ファイルに読み書きする際どのようなときに付けるのか付けないのか・・・。

み~

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

#14

投稿記事 by み~ » 18年前

miyazaさん。。
それなら二次元の方がいいですね。。了解です!!

でも、上のコードを今度二次元にしてみたのです。。そしたらやはり思ったようには書き込まれていなかった。。
include <stdio.h>
#define NUM 5
int main(void) {
	char no[NUM][NUM] = {1,2,3,4,5};
	int i ;
	FILE *fp;
	fp = fopen("test.txt","w");
	if(fp == NULL){
		return 1;
	}else{
		printf("open\n");
	}

	//for(i = 0; i < NUM; i++) {
		//fgets(&no,sizeof(no),fp );
		
	//}

	for(i = 0; i < NUM; i++) {
		fprintf(fp,"%d\n", no);
	}
	fclose(fp);
	return 0;
}

miyaza

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

#15

投稿記事 by miyaza » 18年前

今回は二次元配列にする必要がありません。
あつかっているのは12345だけなので二次元にしても意味がありません。

言葉がたりませんでした、複数の文字列を扱うときには二次元配列の方がいいというはなしです。

み~

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

#16

投稿記事 by み~ » 18年前

miyazaさん、そうですか。了解しました。。

もう少しいろいろ試した見ます!!

むつ

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

#17

投稿記事 by むつ » 18年前

イージーミスが多いですよ。
とりあえずコーヒー飲んで落ち着こう!

/* */ // & , . " ' {} = これらの文字に色を付ければ、タイプミスは防げると思いますよ。

それと、前日のスレに自分が掲示した読み書きのサンプルを触ってみてください。
色々とヒントを詰め込んだつもりです。

み~

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

#18

投稿記事 by み~ » 18年前

むつさん!!了解です!!

ちなみに今ファイルからの読み込み成功しました!!!!

み~

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

#19

投稿記事 by み~ » 18年前

今、あらたなプログラム書いてます!!

み~

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

#20

投稿記事 by み~ » 18年前

[/pre]
#include <stdio.h>
#define NUM 3

int main(void) {
char no[NUM][10];
char name[NUM][20];
int point;
int i;

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

for(i = 0 ; i < NUM; i++) {
printf("NO:");
fgets(no,sizeof(no),stdin);
printf("NAME:");
fgets(name,sizeof(name),stdin);
printf("点数:");
scanf("%d",&point);
}

for(i = 0; i < NUM; i++) {
fprintf(fp, "%d\n",no);
fprintf(fp, "%s\n", name);
fprintf(fp , "%d\n", point);
}

fclose(fp);
return 0;
}

[/pre]
うまく書き込めないです。
なぜかno入力が飛ばされる

miyaza

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

#21

投稿記事 by miyaza » 18年前

とりあえずfpのエラー処理

if(fp=NULL)からif(fp==NULL)に直してください。

miyaza

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

#22

投稿記事 by miyaza » 18年前

書き込み部分
scanf()の下にfflush(stdin)と追加してください。
とりあえず書き込めるようになります。

keichan

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

#23

投稿記事 by keichan » 18年前

これかな?
printf("点数:");
scanf("%d",&point);

printf("点数:");
scanf("%d ",&point);

み~

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

#24

投稿記事 by み~ » 18年前

なぜか二回目のループの時だけnoがとばされる・・・なぜ??

miyaza

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

#25

投稿記事 by miyaza » 18年前

3人分の点数を入れるならpointも3つ確保してください。

miyaza

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

#26

投稿記事 by miyaza » 18年前

> なぜか二回目のループの時だけnoがとばされる・・・なぜ??
入力バッファをクリアしていないからだと思います。たぶんですが。

み~

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

#27

投稿記事 by み~ » 18年前

ダメです・・・・。
#include <stdio.h>
#define NUM 3

int main(void) {
	char no[NUM][10];
	char name[NUM][20];
	int point[NUM];
	int i;

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

	for(i = 0 ; i < NUM; i++) {
		printf("NO:");
		fgets(no,sizeof(no),stdin);
		printf("NAME:");
		fgets(name,sizeof(name),stdin);
		printf("点数:");
		scanf("%d",&point);
	}

	for(i = 0; i < NUM; i++) {
			fprintf(fp, "%d\n",no);
			fprintf(fp, "%s\n", name);
			fprintf(fp , "%d\n", point);
	}

	fclose(fp);
	return 0;
}

noだけがとばされますね・・・。

miyaza

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

#28

投稿記事 by miyaza » 18年前

入力バッファに残ったものが次にfgets()が来たときfgts()に入れられてこちらの入力が飛ばされてしまいます。
だからバッファをクリアして下さい。

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

#29

投稿記事 by » 18年前

保存時の時を考えて統一した方がいいのでは?

for(i = 0 ; i < NUM; i++)
{
  printf("NO:");
  fgets(no,sizeof(no),stdin);
  printf("NAME:");
  fgets(name,sizeof(name),stdin);
  printf("点数:");
  scanf("%d", &point);
}

  ↓

for(i = 0 ; i < NUM; i++)
{
  printf("NO:");
  scanf("%s", &no);
  printf("NAME:");
  scanf("%s", name);
  printf("点数:");
  scanf("%d", &point);
}

み~

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

#30

投稿記事 by み~ » 18年前

>>入力バッファに残ったものが次にfgets()が来たときfgts()に入れられてこちらの入力が飛ばされてしまいます。
だからバッファをクリアして下さい。


クリアとはどのようにするのですか??

miyaza

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

#31

投稿記事 by miyaza » 18年前

scanf()の下にfflush(stdin)と追加してください。
とりあえず書き込めるようになります。

fprintf(fp,"%d",no);
から
fprintf(fp,"%s",no);
に変更

み~

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

#32

投稿記事 by み~ » 18年前

コンソールから入力したのにファイルができてないです。。

miyaza

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

#33

投稿記事 by miyaza » 18年前

なにも書き込まれていないのでは無くファイルが出来ていないということですよね?

fopen()からの処理に問題がありませんか?

み~

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

#34

投稿記事 by み~ » 18年前

#include <stdio.h>
#define NUM 3

int main(void) {
	char no[NUM][10];
	char name[NUM][20];
	int point[NUM];
	int i;

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

	for(i = 0 ; i < NUM; i++) {
		printf("NO:");
		fgets(no,sizeof(no),stdin);
		printf("NAME:");
		fgets(name,sizeof(name),stdin);
		printf("点数:");
		scanf("%d",&point);
		fflush(stdin);
	}

	for(i = 0; i < NUM; i++) {
			fprintf(fp, "NO:%s\n",no);
			fprintf(fp, "NAME:%s\n", name);
			fprintf(fp , "POINT:%d\n", point);
	}

	fclose(fp);
	return 0;
}

コードです

み~

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

#35

投稿記事 by み~ » 18年前

なんでファイルができないのでしょう??
コードおかしいのかな??

miyaza

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

#36

投稿記事 by miyaza » 18年前

こちらで確認してみましたtest.txtは作成されていました。

しかしpointの値がおかしかったです。

fprintf(fp , "POINT:%d",point);

と直してください。

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

#37

投稿記事 by » 18年前

ファイルに書き込まれてますよ?

点数を書き込む処理を
 fprintf(fp , "POINT:%d\n", point);
に変更しましょう。


GPGA

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

#39

投稿記事 by GPGA » 18年前

み~さんの環境がVC6なので、fflushで入力バッファをクリアすることができていますが
Cの規格では、入力ストリームに対するfflushは未定義であるため、推奨されません。

MSDNでは、fflushを使用して入力ストリームをクリアするサンプルがあり
その行のコメントは以下のようになっています。

fflush on input stream is an extension to the C standard


また、この件は以前この掲示板の話題に上がっていますので、ご参考ください。 http://www.play21.jp/board/formz.cgi?ac ... q&rln=4467

み~

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

#40

投稿記事 by み~ » 18年前

GPGAさん、了解です!!
#include <stdio.h>
#define NUM 3

int main(void) {
	FILE *fp;
	char no[NUM][10];
	char name[NUM][20];
	int point[NUM];
	int i;

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

	for(i = 0; i < NUM; i++) {
		fscanf(fp,"%*%s",&no);
		fscanf(fp,"%*%s",&name);
		fscanf(fp,"%*%d",&point);
	}

	for(i = 0; i < NUM; i++) {
		printf("%s\n",no);
		printf("%s\n",name);
		printf("%d\n", point);
	}

	fclose(fp);

	return 0;
}

読み取れないんですけど。。

み~

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

#41

投稿記事 by み~ » 18年前

fscanf(fp,"%*%s",&no);
fscanf(fp,"%*%s",&name);
fscanf(fp,"%*%d",&point);の部分を%*を取ればできたのですが、最後のpointだけ正常に
読み取れないです・・。

miyaza

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

#42

投稿記事 by miyaza » 18年前

fflush()のことは知りませんでした。すいません。よく調べてから書き込むべきでした。

int型で読めないのなら文字列として読み取って見るのも手かもしれません。

GPGA

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

#43

投稿記事 by GPGA » 18年前

今回は POINT: と数値の間にスペースが無いんですね。
そうすると

× fscanf(fp, "%*%d", &point);
○ fscanf(fp, "%*[^0-9]%d ", &point);

といったところでしょうか。
 

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

#44

投稿記事 by » 18年前

どのように表示をしたいのでしょうか?

NO:1
NAME:1
POINT:1
 ・
 ・
 ・

それとも
1
1
1

み~

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

#45

投稿記事 by み~ » 18年前

文字列としてもむりでした。例外がおきてしまいました。。

>>× fscanf(fp, "%*%d", &point);
○ fscanf(fp, "%*[^0-9]%d ", &point);

もっと簡単なやりかたないですかね??まだまだ私にはこのようなやり方は
考え出せそうもないので・・・・。レベルにあったやりかたで。

miyaza

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

#46

投稿記事 by miyaza » 18年前

> 文字列としてもむりでした。例外がおきてしまいました。。


変数
char point[NUM][10];

読み込み
fscanf(fp,"%s",&point);

表示
printf("%s\n", point);

という感じで修正しましたか?

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

#47

投稿記事 by » 18年前

変数pointをint型からchar型に直しましたか?
int型で文字列は読めませんよ。

バグ

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

#48

投稿記事 by バグ » 18年前

『何でもかんでも教えてもらえばいいや』という姿勢は如何なものかと思いますよ。

自分で調べたり、考えたりした事でないと、本当の意味で身に付かないと思います。

失礼かもしれませんが、ファイル云々よりも、もっと前の段階を参考書などを読んで理解を深めてから、取り組んだ方がいいのではないでしょうか?

むつ

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

#49

投稿記事 by むつ » 18年前

 今、一つのファイルで【データの蓄積】と【最新データの確認】と両方をこなしています。
ですから、fscanf()で複雑な事をしなくてはいけなくなります。

■蓄積用ファイルには、NO:、NAME:、POINT:等とつけないで保存する。

■データの最新データを確認したい場合は、fopen "r"で読み込んだ後、
printf()でNO:、NAME:、POINT:と書式付でコンソールに表示するか、
または、別の確認用ファイルに出力してください。

み~

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

#50

投稿記事 by み~ » 18年前

miyazaさん、※さん、むつさんアドバイスありがとうございます!!
読み込みが無事できました!!!

バグさん。。おっしゃる通りです。。もう一度基本的なことから勉強してみます!!
ただ、ファイルに関してはなぜか苦手意識がついてしまったみたいで自信が持てないのです。。
不安で不安で仕方ないのです。。

み~

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

#51

投稿記事 by み~ » 18年前

何回やってもコンパイルエラーが出てしまいます。。
include <stdio.h>

int main(void) {
	int a[10] = {1,2,3,4,5,6,7,8,9,};
	int i;
	FILE *fp;
	fp = fopen("test1.txt","rb");
	if(fp == NULL) {
		return 1;
	}else{
		printf("open\n");
	}
	
	for(i = 0; i < 10; i++) {
		fwrite(&a,sizeof(a),1,fp);
	}
	for(i = 0; i <10; i++){
		fprintf("%d",a,fp);
	}
	printf("OK");

	
	fclose(fp);
	return 0;
}

エラー内容:1行目、宣言の構文エラーと出ます。

組木紙織

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

#52

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

#include

落ち着いて考えてください

み~

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

#53

投稿記事 by み~ » 18年前

組木紙織さん!!ありがとうございます!!

コンパイルはできたのですが、ファイルができないのです・・・。ず~と考えてるのですが・・限界です。。

み~

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

#54

投稿記事 by み~ » 18年前

たった今、コンパイル、実行できましたが、読み込みができないですね~。
読み込んでいるときにエラーになってしまいます。。
#include <stdio.h>

int main(void) {
	int a[10];
	int i;
	FILE *fp;
	fp = fopen("test1.txt","rb");
	if(fp == NULL) {
		return 1;
	}else{
		printf("open\n");
	}
	
	
		fread(&a,sizeof(a),1,fp);
	

	printf("%d",&a);
	fclose(fp);
	return 0;
}

読み込みのコードですが、どっか変ですかね??

組木紙織

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

#55

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

考えるだけでなくコンパイラの警告もきちんと考えましょう。
私のVC++での警告です
/***************/
警告 1 warning C4996: 'fopen' が古い形式として宣言されました。
警告 2 warning C4313: 'printf' : 書式文字列内の '%d' が引数 1 ('int *__w64 ' 型) と競合
警告 3 warning C4700: 初期化されていないローカル変数 'i' が使用されます

/************/
1は無視してもほとんどかまわないので2と3の警告を消すように考えてみてください。

コンパイラは頭いいので、頼りになります。

み~

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

#56

投稿記事 by み~ » 18年前

組木紙織さんありがとうございます。。
ただ、私の場合コンパイルはコンソールでbcc32とかでやってるもんで、そこまで出てきていませんでした。。

み~

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

#57

投稿記事 by み~ » 18年前

警告3は分かったけど、警告2が分からない。。
警告3はfor文作るだけですよね??

実行しても、しっかりと読み取れていない。

組木紙織

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

#58

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

警告3はfor文というより、初期化をしてください!!!。ということです。
警告2はprintf()の引数が変だよと言っています。

み~

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

#59

投稿記事 by み~ » 18年前

こんな感じですけど、読み取れないですね・・・?
#include <stdio.h>

int main(void) {
	int a[10];
	int i;
	
	FILE *fp;
	fp = fopen("test1.txt","rb");
	if(fp == NULL) {
		return 1;
	}else{
		printf("open\n");
	}
	
	for(i = 0; i < 10; i++){
		fread(&a,sizeof(a),1,fp);
	}
	

	printf("%d",a);
	fclose(fp);
	return 0;
}

初期化?? int i = 0;ぐらいしか思い浮かばないです。
引数っていったら&を付けるか付けないかだと思うのですが・・・。
何が違うのだろ・・・?

組木紙織

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

#60

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

これforループで十回連続で読み込んで、その最後+1の読み込みを返しています。

配列を使わずに作り直してみたらどうですか?

み~

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

#61

投稿記事 by み~ » 18年前

やっぱり正しく読み取れなかったのですか??
for文を使わないでですか・・・。思いつかないですね~。。どうすればいいか・・・
テキストなんか見ても、for使ってますし・・・。

組木紙織

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

#62

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

書き方が悪かった。。

始めのひとつだけの読み込み&画面への表示をしてみたらどうですか?
というつもりだったのですが。

先ほどのコードを見てみると
for(i = 0; i < 10; i++){
		fread(&a,sizeof(a),1,fp);
	}
         /*
          ここではiの値は何ですか?
         */
     printf("%d",a);

み~

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

#63

投稿記事 by み~ » 18年前

組木紙織さん。
了解です!!試してみます!!
明日、結果を書きます!!
夜遅くまでありがとうございました!!

み~

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

#64

投稿記事 by み~ » 18年前

こんな感じですけど、読み取れないですね・・・?

#include <stdio.h>

int main(void) {
int a[10];


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


fread(&a[1],sizeof(a[1),1,fp);



printf("%d",a[1]);
fclose(fp);
return 0;
}

一つづつ読み込ませてのですがダメでした。
for文の所消してfread(&a[1],sizeof(a[1]),1,fp);とすればいいのですよね??

それとも書き込みがしっかりできていないのですかね?

み~

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

#65

投稿記事 by み~ » 18年前

元の書き込み用コードです。。
#include <stdio.h>

int main(void) {
	int a[10] = {1,2,3,4,5,6,7,8,9};
	int i;
	FILE *fp;
	fp = fopen("test2.txt","wb");
	if(fp == NULL){
		return 1;
	}else{
		printf("open\n");
	}
	for(i = 0; i < 10; i++){
		fwrite(&a,sizeof(a),1,fp);
	}
	fclose(fp);
	return 0;
}

fwrite()の部分なのですが、aとするとコンパイルエラーで、パーラメター'_ptr'
はconst void * 型として定義されているのでint型は渡せないと出ます。
配列の場合だと&を付けなくても、配列の先頭要素へのポインタとなるのになぜ
&をつけるのでしょうか?

テキストファイルは一応できていました。中身は、£Γというような意味不明の記号みたいなものがありました。

もしかしたら、読み込みが正常にできないというのは書き込みの段階で間違っているのでしょうか??

miyaza

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

#66

投稿記事 by miyaza » 18年前

> 配列の場合だと&を付けなくても、配列の先頭要素へのポインタとなるのになぜ
配列の要素iが変化していっているので、個々の要素にアクセスするためには&が必要です。
先頭アドレスというのはa[0]のアドレスのことです。

み~

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

#67

投稿記事 by み~ » 18年前

miyazaさんおはようございます!!
&はそういうことだったのですか!!スッキリしました。。

ただ、まだバイナリファイルの読み書き苦戦中です。。
普通のファイルの読み書きはだいぶできるようになってきました。。

上のコードですけど、特に怪しいところはありませんよね??

miyaza

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

#68

投稿記事 by miyaza » 18年前

作成されたバイナリファイルの内容は1234567890となっていました。
これで問題ないなら書き込み部分に原因はありません。

み~

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

#69

投稿記事 by み~ » 18年前

最後の0って??なんであるのでしょう??

自分も今、偶然読み込みができたのですよ!!
そしたら、最後に0が・・・。一体なぜ??

miyaza

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

#70

投稿記事 by miyaza » 18年前

書き込みする値を初期化するところに問題があります。
簡単な原因ですからそこを修正して下さい。

み~

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

#71

投稿記事 by み~ » 18年前

miyazaさん!!できました!!成功です!!

み~

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

#72

投稿記事 by み~ » 18年前

先ほど、読み書きできたバイナリファイルを今度はランダムアクセスで読み取ろうと思ったのですが、
やはり失敗しちゃいますね~。読み込むと1245028などとでてきてしまいます。

コードはコンパイルも警告もないのですが・・・。
#include <stdio.h>

int main(void) {
	int a[10];
	
	FILE *fp;
	fp = fopen("test2.txt","rb");
	if(fp == NULL) {
		return 1;
	}else{
		printf("open\n");
	}
	
		fseek(fp,4,SEEK_SET);
		fread(&a,sizeof(a),1,fp);
	

	printf("%d",a);
	fclose(fp);
	return 0;
}

バグ

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

#73

投稿記事 by バグ » 18年前

printf("%d",a);

これが原因ではないでしょうか?
aの先頭アドレスを表示しているようです。

printf("%d",a[n]);

のようにしないと変数の中身は見ることが出来ないです。

み~

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

#74

投稿記事 by み~ » 18年前

バグさんおはようございます!!

printf("%d",a[n]);とすると、最初にint = n;と宣言してやったのですが、実行するとエラーに
なってしまいますね。。

miyaza

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

#75

投稿記事 by miyaza » 18年前

nに値は、入っていますか?

み~

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

#76

投稿記事 by み~ » 18年前

nに値をいれなくてもprinf("%d"a[1])とかすれば大丈夫ですよね?
int n=1;
printf("%d",a[1]);としても同じことですし。

でも、理解できないのが、fseek()で先頭から4バイト目を読み取るって指定してるじゃないですか。
a[/url]のなかに値を入れたらfseeku()ってほとんど意味なくなってしまうのではないですか??

一応、int n=1;としてprintf("%d",a[n]);としたら、3と出てきました。

miyaza

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

#77

投稿記事 by miyaza » 18年前

fseek()をコメントアウトしてint i=1;としてprintf("%d",a[n]);としたらどうなりますか?

miyaza

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

#78

投稿記事 by miyaza » 18年前

> fseek()をコメントアウトしてint i=1;としてprintf("%d",a[n]);としたらどうなりますか?
fseek()をコメントアウトしてint n=1;としてprintf("%d",a[n]);としたらどうなりますか?
間違えました。

バイナリファイルの中には様々な情報を格納していくことになるでしょう。そしてそれを必要としたとき指定した所から指定した大きさ分取り出すことができるのはとても便利なので、ランダムアクセスはとても意味のあることだと思います。

み~

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

#79

投稿記事 by み~ » 18年前

>fseek()をコメントアウトしてint n=1;としてprintf("%d",a[n]);としたらどうなりますか?

やってみました。結果は2とでてきました。

これってどういうことでしょう?fseek()を使わなくても読み取れてしまいましたが・・・。

み~

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

#80

投稿記事 by み~ » 18年前

int i = 2; としてやったら今度は3がでてきて確かにしっかり読み込めています。。
でも、これではfseek()の意味がなくなってしまいますよな??

miyaza

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

#81

投稿記事 by miyaza » 18年前

fseek()はファイルポインタ位置を変えています。
つまりfseek(fp,4,SEEK_SET)としたときは、4バイト目からが開始位置となります。
fread()で実際に読みこんでいます。

だからfseek(fp,4,SEEK_SET)したときとfseek()をコメントアウトしたときでは、freadが読み込み始める位置が4倍と違います。だから2と3と結果が違うのは4バイト分のずれのせいです。

miyaza

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

#82

投稿記事 by miyaza » 18年前

たとえば4バイトずつナンバーを格納したバイナリファイルを作るとしましょう。
一人目の人のナンバー二人目の人のナンバー三人目の人のナンバーと連続で入っているとして、その中から3人目の人のナンバーだけ変数 int num にとり出せと言われたらどうしますか?

み~

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

#83

投稿記事 by み~ » 18年前

int型は4バイトですよね。すると、fseek(fp,4,SEEK_SET)とした時、配列でいうと何処が読み始める位置になるのですか?

[0][1][2][3][4][5][6][7][8][9]←添え字
[1][2][3][4][5][6][7][8][9][10] ←値

int i = 1
fseek(fp,4,SEEK_SET)
printf("%d",a);
だと3と出てくる。。やっぱり、何処から読み込みはじめてるのか・・・。もやもやする。。

miyaza

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

#84

投稿記事 by miyaza » 18年前

fseek(fp,4,SEEK_SET)だと

[0][1][2][3][4][5][6][7][8][9] 添え字
[2][3][4][5][6][7][8][9][10]  値

こうなります。

み~

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

#85

投稿記事 by み~ » 18年前

理解できました!!!

fseek(fp,8,SEEK_SET)でint i =1;にした場合だと、4がでますよね。
づれているわけですね。

み~

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

#86

投稿記事 by み~ » 18年前

みなさんお久しぶりです。ファイルはだいぶできるようになったのですが、またまたつまずいています。

書き込みのコード
#include <stdio.h>

int main(void) {
	int num[10] = {1,2,3,4,5,6,7,8,9,};
	int i;

	FILE *fp;
	fp = fopen("test2.txt","wb");
	if(fp == NULL) {
		return 1;
	}else{
		printf("open\n");
	}
	
	for(i = 0; i < 10; i++){
		fwrite(&num,sizeof(num),1,fp);
	}
	
	fclose(fp);
	return 0;
}


読み込みのコード
include <stdio.h>

int main(void) {
	int num[10];
	int i ;
	FILE *fp;
	fp =fopen("test2.txt","rb");
	if(fp == NULL) {
		return 1;
	}else{
		printf("open\n");
	}
	
	for(i = 0; i < 10; i++) {
			fread(&num,sizeof(num),1,fp);
	}

	for(i = 0; i < 10; i++) {
		printf("%d\n",&num);
	}

	fclose(fp);
	return 0;
}

うまく読み取れないのです。。

miyaza

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

#87

投稿記事 by miyaza » 18年前

読み取り表示部分
printf()でnumのアドレスを渡しています。アドレスではなく値を渡してください。

み~

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

#88

投稿記事 by み~ » 18年前

miyazaさんお久しぶりです。毎回アドバイスありがとうございます。無事読み取りできました!!

少しずつではありますが、コードが書けるようになってきました。関数の引数なども調べればなんとかなってきています。だが、小さなミスが多すぎますね~自分の場合。

み~

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

#89

投稿記事 by み~ » 18年前

今、バイナリファイルに文字列を書き込み、ランダムアクセスで特定の文字列を読み取ろうとしているのですが、苦戦中です。。なぜか、ファイルはできているのに書き込まれていないのです。。
#include <stdio.h>

int main(void) {
	char ch[/url] = "hello";

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

	fwrite(&ch[/url],sizeof(char),1,fp);

	fclose(fp);
	return 0;
}
fwrite(&ch[/url],sizeof(char),1,fp);の部分で[/url]をはずすとコンパイルできるのですが、[/url]を付けると
C:\vc\RA_test2\rw_ex01.c(14) : error C2059: 構文エラー : ']'とでてしまいます。

miyaza

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

#90

投稿記事 by miyaza » 18年前

fwrite(ch,sizeof(ch),1,fp);
として下さい。

み~

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

#91

投稿記事 by み~ » 18年前

治してみました。確かにコンパイル実行もできました。ファイルには、hとしか書き込まれていませんでしたが、これでいいのでしょうか?一応、バイナリ形式で書き込んだつもりなのですが・・・

miyaza

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

#92

投稿記事 by miyaza » 18年前

こちらでは、helloと書き込めましたが。

み~

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

#93

投稿記事 by み~ » 18年前

そうですか。。もう一度試してみます!!
後、バイナリ形式で書き込んでいるので、普通は人間が見ても分からないような感じで書き込まれているのではないですか?普通にhelloと書き込まれていてもいいものなのでしょうか??

み~

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

#94

投稿記事 by み~ » 18年前

もう一度コンパイルしたらエラーが出てしまいますね。。
#include <stdio.h>

int main(void) {
	char ch[/url] = "hello";

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

	fwrite(ch,sizeof(char),1,fp);

	fclose(fp);
	return 0;
}
IBCD.lib(crt0.obj) : error LNK2001: 外部シンボル "_main" は未解決です
Debug/RRA_test.exe : fatal error LNK1120: 外部参照 1 が未解決です。

miyaza

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

#95

投稿記事 by miyaza » 18年前

このファイルをバイナリエディタで開くと、68 65 6C 6C 6F 00 と書き込まれています。
68がh 65がe という感じです。

keichan

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

#96

投稿記事 by keichan » 18年前

fwrite 関数の仕様を確認してください。

[color=#ff00ff">size_t[/color] fwrite(
    [color=#0000ff">const[/color] [color=#0000ff">void[/color] *buffer,    /* 書き込むデータへのポインタ */
    [color=#ff00ff">size_t[/color] size,        /* 項目のサイズ(バイト単位) */
    [color=#ff00ff">size_t[/color] [color=#ff00ff">count[/color],        /* 書き込む最大項目数 */
    FILE *stream        /* FILE構造体へのポインタ */
);

ですので、

fwrite(ch, sizeof(char), 1, fp);

では、
	chの先頭アドレスから(ch)
	1バイト単位で(sizeof(char))
	最大1項目を(1)
	FILEへ書き込み(fp)
となります。

ですから出力結果は'h'しか出力しない。ということが分かりますね?

では み~さんが期待する出力をしたい場合はどうすればいいでしょうか?

み~

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

#97

投稿記事 by み~ » 18年前

keichan さんへ
・・・なんとなく分かります。いろいろ試してみます!!アドバイスありがとうございます!!

み~

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

#98

投稿記事 by み~ » 18年前

IBCD.lib(crt0.obj) : error LNK2001: 外部シンボル "_main" は未解決です
Debug/RRA_test.exe : fatal error LNK1120: 外部参照 1 が未解決です。
のエラーが解決できないですね・・・・。

miyaza

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

#99

投稿記事 by miyaza » 18年前

使っているのはVCですか?
だったらプロジェクトの設定がまずかったんだと思います。
もう一回プロジェクトから作り直してみてはどうでしょう。
main()がないと起こるエラーですが。

み~

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

#100

投稿記事 by み~ » 18年前

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

閉鎖

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