ファイルの読み込み書き込み
ファイルの読み込み書き込み
おはようございます!!書き込みが多くなったので新たにスレをたてさせていただきます!!
毎日毎日、同じような質問に親切にアドバイスをくださる皆様にはものすごく感謝しております!!
毎日毎日、同じような質問に親切にアドバイスをくださる皆様にはものすごく感謝しております!!
Re:ファイルの読み込み書き込み
#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:ファイルの読み込み書き込み
キーボードから入力して書き込みたいのですか?
それとも配列の初期値12345を書き込みたいのですか?
後者ならばfgets()を使う必要はありません。
それとも配列の初期値12345を書き込みたいのですか?
後者ならばfgets()を使う必要はありません。
Re:ファイルの読み込み書き込み
miyazaさんおはようごうざいます!!
初期値を書き込みたいのです。。キーボード入力しないならfgets()はいらないと気づいてfgets()部分
をけしたのですが、ダメでした。。
初期値を書き込みたいのです。。キーボード入力しないならfgets()はいらないと気づいてfgets()部分
をけしたのですが、ダメでした。。
Re:ファイルの読み込み書き込み
書き込まれたファイルを見ると、意味不明な文字とかが書かれているのです・・・。
fprintf(fp,"%d\n", &no);の部分なんですけど、%dじゃなくて%sですかね。。char no[NUM]となって
いることだし・・・・。
fprintf(fp,"%d\n", &no);の部分なんですけど、%dじゃなくて%sですかね。。char no[NUM]となって
いることだし・・・・。
Re:ファイルの読み込み書き込み
前日のソースでは fprintf(fp,"%d\n", &no); において
noとしていましたよね。
エディタは何をお使いでしょうか。
タイプミス防止の為、「 & 」に色を付けてみてはいかがでしょうか。
noとしていましたよね。
エディタは何をお使いでしょうか。
タイプミス防止の為、「 & 」に色を付けてみてはいかがでしょうか。
Re:ファイルの読み込み書き込み
>>fprintf()の&を取ればおそらく大丈夫です。
これでできましたよ!!
でも、どうしてもコンソールから入力させて一次元でもできるようになりたいですね~。。
これでできましたよ!!
でも、どうしてもコンソールから入力させて一次元でもできるようになりたいですね~。。
Re:ファイルの読み込み書き込み
むつさんおはようございます!!
なんというか&の使い方がよく分からないのです。。
ポインタの所とかよんでいるのですが・・・。
ファイルに読み書きする際どのようなときに付けるのか付けないのか・・・。
なんというか&の使い方がよく分からないのです。。
ポインタの所とかよんでいるのですが・・・。
ファイルに読み書きする際どのようなときに付けるのか付けないのか・・・。
Re:ファイルの読み込み書き込み
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; }
Re:ファイルの読み込み書き込み
今回は二次元配列にする必要がありません。
あつかっているのは12345だけなので二次元にしても意味がありません。
言葉がたりませんでした、複数の文字列を扱うときには二次元配列の方がいいというはなしです。
あつかっているのは12345だけなので二次元にしても意味がありません。
言葉がたりませんでした、複数の文字列を扱うときには二次元配列の方がいいというはなしです。
Re:ファイルの読み込み書き込み
イージーミスが多いですよ。
とりあえずコーヒー飲んで落ち着こう!
/* */ // & , . " ' {} = これらの文字に色を付ければ、タイプミスは防げると思いますよ。
それと、前日のスレに自分が掲示した読み書きのサンプルを触ってみてください。
色々とヒントを詰め込んだつもりです。
とりあえずコーヒー飲んで落ち着こう!
/* */ // & , . " ' {} = これらの文字に色を付ければ、タイプミスは防げると思いますよ。
それと、前日のスレに自分が掲示した読み書きのサンプルを触ってみてください。
色々とヒントを詰め込んだつもりです。
Re:ファイルの読み込み書き込み
[/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入力が飛ばされる
#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入力が飛ばされる
Re:ファイルの読み込み書き込み
これかな?
printf("点数:");
scanf("%d",&point);
↓
printf("点数:");
scanf("%d ",&point);
printf("点数:");
scanf("%d",&point);
↓
printf("点数:");
scanf("%d ",&point);
Re:ファイルの読み込み書き込み
ダメです・・・・。
noだけがとばされますね・・・。
#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だけがとばされますね・・・。
Re:ファイルの読み込み書き込み
入力バッファに残ったものが次にfgets()が来たときfgts()に入れられてこちらの入力が飛ばされてしまいます。
だからバッファをクリアして下さい。
だからバッファをクリアして下さい。
Re:ファイルの読み込み書き込み
保存時の時を考えて統一した方がいいのでは?
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);
}
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:ファイルの読み込み書き込み
>>入力バッファに残ったものが次にfgets()が来たときfgts()に入れられてこちらの入力が飛ばされてしまいます。
だからバッファをクリアして下さい。
クリアとはどのようにするのですか??
だからバッファをクリアして下さい。
クリアとはどのようにするのですか??
Re:ファイルの読み込み書き込み
scanf()の下にfflush(stdin)と追加してください。
とりあえず書き込めるようになります。
fprintf(fp,"%d",no);
から
fprintf(fp,"%s",no);
に変更
とりあえず書き込めるようになります。
fprintf(fp,"%d",no);
から
fprintf(fp,"%s",no);
に変更
Re:ファイルの読み込み書き込み
#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:ファイルの読み込み書き込み
こちらで確認してみましたtest.txtは作成されていました。
しかしpointの値がおかしかったです。
fprintf(fp , "POINT:%d",point);
と直してください。
しかしpointの値がおかしかったです。
fprintf(fp , "POINT:%d",point);
と直してください。
Re:ファイルの読み込み書き込み
み~さんの環境が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
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:ファイルの読み込み書き込み
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:ファイルの読み込み書き込み
fscanf(fp,"%*%s",&no);
fscanf(fp,"%*%s",&name);
fscanf(fp,"%*%d",&point);の部分を%*を取ればできたのですが、最後のpointだけ正常に
読み取れないです・・。
fscanf(fp,"%*%s",&name);
fscanf(fp,"%*%d",&point);の部分を%*を取ればできたのですが、最後のpointだけ正常に
読み取れないです・・。
Re:ファイルの読み込み書き込み
fflush()のことは知りませんでした。すいません。よく調べてから書き込むべきでした。
int型で読めないのなら文字列として読み取って見るのも手かもしれません。
int型で読めないのなら文字列として読み取って見るのも手かもしれません。
Re:ファイルの読み込み書き込み
今回は POINT: と数値の間にスペースが無いんですね。 そうすると × fscanf(fp, "%*%d", &point); ○ fscanf(fp, "%*[^0-9]%d ", &point); といったところでしょうか。
Re:ファイルの読み込み書き込み
文字列としてもむりでした。例外がおきてしまいました。。
>>× fscanf(fp, "%*%d", &point);
○ fscanf(fp, "%*[^0-9]%d ", &point);
もっと簡単なやりかたないですかね??まだまだ私にはこのようなやり方は
考え出せそうもないので・・・・。レベルにあったやりかたで。
>>× fscanf(fp, "%*%d", &point);
○ fscanf(fp, "%*[^0-9]%d ", &point);
もっと簡単なやりかたないですかね??まだまだ私にはこのようなやり方は
考え出せそうもないので・・・・。レベルにあったやりかたで。
Re:ファイルの読み込み書き込み
> 文字列としてもむりでした。例外がおきてしまいました。。
変数
char point[NUM][10];
読み込み
fscanf(fp,"%s",&point);
表示
printf("%s\n", point);
という感じで修正しましたか?
変数
char point[NUM][10];
読み込み
fscanf(fp,"%s",&point);
表示
printf("%s\n", point);
という感じで修正しましたか?
Re:ファイルの読み込み書き込み
『何でもかんでも教えてもらえばいいや』という姿勢は如何なものかと思いますよ。
自分で調べたり、考えたりした事でないと、本当の意味で身に付かないと思います。
失礼かもしれませんが、ファイル云々よりも、もっと前の段階を参考書などを読んで理解を深めてから、取り組んだ方がいいのではないでしょうか?
自分で調べたり、考えたりした事でないと、本当の意味で身に付かないと思います。
失礼かもしれませんが、ファイル云々よりも、もっと前の段階を参考書などを読んで理解を深めてから、取り組んだ方がいいのではないでしょうか?
Re:ファイルの読み込み書き込み
今、一つのファイルで【データの蓄積】と【最新データの確認】と両方をこなしています。
ですから、fscanf()で複雑な事をしなくてはいけなくなります。
■蓄積用ファイルには、NO:、NAME:、POINT:等とつけないで保存する。
■データの最新データを確認したい場合は、fopen "r"で読み込んだ後、
printf()でNO:、NAME:、POINT:と書式付でコンソールに表示するか、
または、別の確認用ファイルに出力してください。
ですから、fscanf()で複雑な事をしなくてはいけなくなります。
■蓄積用ファイルには、NO:、NAME:、POINT:等とつけないで保存する。
■データの最新データを確認したい場合は、fopen "r"で読み込んだ後、
printf()でNO:、NAME:、POINT:と書式付でコンソールに表示するか、
または、別の確認用ファイルに出力してください。
Re:ファイルの読み込み書き込み
miyazaさん、※さん、むつさんアドバイスありがとうございます!!
読み込みが無事できました!!!
バグさん。。おっしゃる通りです。。もう一度基本的なことから勉強してみます!!
ただ、ファイルに関してはなぜか苦手意識がついてしまったみたいで自信が持てないのです。。
不安で不安で仕方ないのです。。
読み込みが無事できました!!!
バグさん。。おっしゃる通りです。。もう一度基本的なことから勉強してみます!!
ただ、ファイルに関してはなぜか苦手意識がついてしまったみたいで自信が持てないのです。。
不安で不安で仕方ないのです。。
Re:ファイルの読み込み書き込み
何回やってもコンパイルエラーが出てしまいます。。
エラー内容:1行目、宣言の構文エラーと出ます。
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:ファイルの読み込み書き込み
たった今、コンパイル、実行できましたが、読み込みができないですね~。
読み込んでいるときにエラーになってしまいます。。
読み込みのコードですが、どっか変ですかね??
読み込んでいるときにエラーになってしまいます。。
#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:ファイルの読み込み書き込み
考えるだけでなくコンパイラの警告もきちんと考えましょう。
私のVC++での警告です
/***************/
警告 1 warning C4996: 'fopen' が古い形式として宣言されました。
警告 2 warning C4313: 'printf' : 書式文字列内の '%d' が引数 1 ('int *__w64 ' 型) と競合
警告 3 warning C4700: 初期化されていないローカル変数 'i' が使用されます
/************/
1は無視してもほとんどかまわないので2と3の警告を消すように考えてみてください。
コンパイラは頭いいので、頼りになります。
私のVC++での警告です
/***************/
警告 1 warning C4996: 'fopen' が古い形式として宣言されました。
警告 2 warning C4313: 'printf' : 書式文字列内の '%d' が引数 1 ('int *__w64 ' 型) と競合
警告 3 warning C4700: 初期化されていないローカル変数 'i' が使用されます
/************/
1は無視してもほとんどかまわないので2と3の警告を消すように考えてみてください。
コンパイラは頭いいので、頼りになります。
Re:ファイルの読み込み書き込み
こんな感じですけど、読み取れないですね・・・?
初期化?? int i = 0;ぐらいしか思い浮かばないです。
引数っていったら&を付けるか付けないかだと思うのですが・・・。
何が違うのだろ・・・?
#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:ファイルの読み込み書き込み
やっぱり正しく読み取れなかったのですか??
for文を使わないでですか・・・。思いつかないですね~。。どうすればいいか・・・
テキストなんか見ても、for使ってますし・・・。
for文を使わないでですか・・・。思いつかないですね~。。どうすればいいか・・・
テキストなんか見ても、for使ってますし・・・。
Re:ファイルの読み込み書き込み
書き方が悪かった。。
始めのひとつだけの読み込み&画面への表示をしてみたらどうですか?
というつもりだったのですが。
先ほどのコードを見てみると
始めのひとつだけの読み込み&画面への表示をしてみたらどうですか?
というつもりだったのですが。
先ほどのコードを見てみると
for(i = 0; i < 10; i++){ fread(&a,sizeof(a),1,fp); } /* ここではiの値は何ですか? */ printf("%d",a);
Re:ファイルの読み込み書き込み
こんな感じですけど、読み取れないですね・・・?
#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);とすればいいのですよね??
それとも書き込みがしっかりできていないのですかね?
#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:ファイルの読み込み書き込み
元の書き込み用コードです。。
fwrite()の部分なのですが、aとするとコンパイルエラーで、パーラメター'_ptr'
はconst void * 型として定義されているのでint型は渡せないと出ます。
配列の場合だと&を付けなくても、配列の先頭要素へのポインタとなるのになぜ
&をつけるのでしょうか?
テキストファイルは一応できていました。中身は、£Γというような意味不明の記号みたいなものがありました。
もしかしたら、読み込みが正常にできないというのは書き込みの段階で間違っているのでしょうか??
#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型は渡せないと出ます。
配列の場合だと&を付けなくても、配列の先頭要素へのポインタとなるのになぜ
&をつけるのでしょうか?
テキストファイルは一応できていました。中身は、£Γというような意味不明の記号みたいなものがありました。
もしかしたら、読み込みが正常にできないというのは書き込みの段階で間違っているのでしょうか??
Re:ファイルの読み込み書き込み
> 配列の場合だと&を付けなくても、配列の先頭要素へのポインタとなるのになぜ
配列の要素iが変化していっているので、個々の要素にアクセスするためには&が必要です。
先頭アドレスというのはa[0]のアドレスのことです。
配列の要素iが変化していっているので、個々の要素にアクセスするためには&が必要です。
先頭アドレスというのはa[0]のアドレスのことです。
Re:ファイルの読み込み書き込み
miyazaさんおはようございます!!
&はそういうことだったのですか!!スッキリしました。。
ただ、まだバイナリファイルの読み書き苦戦中です。。
普通のファイルの読み書きはだいぶできるようになってきました。。
上のコードですけど、特に怪しいところはありませんよね??
&はそういうことだったのですか!!スッキリしました。。
ただ、まだバイナリファイルの読み書き苦戦中です。。
普通のファイルの読み書きはだいぶできるようになってきました。。
上のコードですけど、特に怪しいところはありませんよね??
Re:ファイルの読み込み書き込み
先ほど、読み書きできたバイナリファイルを今度はランダムアクセスで読み取ろうと思ったのですが、
やはり失敗しちゃいますね~。読み込むと1245028などとでてきてしまいます。
コードはコンパイルも警告もないのですが・・・。
やはり失敗しちゃいますね~。読み込むと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:ファイルの読み込み書き込み
printf("%d",a);
これが原因ではないでしょうか?
aの先頭アドレスを表示しているようです。
printf("%d",a[n]);
のようにしないと変数の中身は見ることが出来ないです。
これが原因ではないでしょうか?
aの先頭アドレスを表示しているようです。
printf("%d",a[n]);
のようにしないと変数の中身は見ることが出来ないです。
Re:ファイルの読み込み書き込み
バグさんおはようございます!!
printf("%d",a[n]);とすると、最初にint = n;と宣言してやったのですが、実行するとエラーに
なってしまいますね。。
printf("%d",a[n]);とすると、最初にint = n;と宣言してやったのですが、実行するとエラーに
なってしまいますね。。
Re:ファイルの読み込み書き込み
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と出てきました。
int n=1;
printf("%d",a[1]);としても同じことですし。
でも、理解できないのが、fseek()で先頭から4バイト目を読み取るって指定してるじゃないですか。
a[/url]のなかに値を入れたらfseeku()ってほとんど意味なくなってしまうのではないですか??
一応、int n=1;としてprintf("%d",a[n]);としたら、3と出てきました。
Re:ファイルの読み込み書き込み
> fseek()をコメントアウトしてint i=1;としてprintf("%d",a[n]);としたらどうなりますか?
fseek()をコメントアウトしてint n=1;としてprintf("%d",a[n]);としたらどうなりますか?
間違えました。
バイナリファイルの中には様々な情報を格納していくことになるでしょう。そしてそれを必要としたとき指定した所から指定した大きさ分取り出すことができるのはとても便利なので、ランダムアクセスはとても意味のあることだと思います。
fseek()をコメントアウトしてint n=1;としてprintf("%d",a[n]);としたらどうなりますか?
間違えました。
バイナリファイルの中には様々な情報を格納していくことになるでしょう。そしてそれを必要としたとき指定した所から指定した大きさ分取り出すことができるのはとても便利なので、ランダムアクセスはとても意味のあることだと思います。
Re:ファイルの読み込み書き込み
>fseek()をコメントアウトしてint n=1;としてprintf("%d",a[n]);としたらどうなりますか?
やってみました。結果は2とでてきました。
これってどういうことでしょう?fseek()を使わなくても読み取れてしまいましたが・・・。
やってみました。結果は2とでてきました。
これってどういうことでしょう?fseek()を使わなくても読み取れてしまいましたが・・・。
Re:ファイルの読み込み書き込み
int i = 2; としてやったら今度は3がでてきて確かにしっかり読み込めています。。
でも、これではfseek()の意味がなくなってしまいますよな??
でも、これではfseek()の意味がなくなってしまいますよな??
Re:ファイルの読み込み書き込み
fseek()はファイルポインタ位置を変えています。
つまりfseek(fp,4,SEEK_SET)としたときは、4バイト目からが開始位置となります。
fread()で実際に読みこんでいます。
だからfseek(fp,4,SEEK_SET)したときとfseek()をコメントアウトしたときでは、freadが読み込み始める位置が4倍と違います。だから2と3と結果が違うのは4バイト分のずれのせいです。
つまりfseek(fp,4,SEEK_SET)としたときは、4バイト目からが開始位置となります。
fread()で実際に読みこんでいます。
だからfseek(fp,4,SEEK_SET)したときとfseek()をコメントアウトしたときでは、freadが読み込み始める位置が4倍と違います。だから2と3と結果が違うのは4バイト分のずれのせいです。
Re:ファイルの読み込み書き込み
たとえば4バイトずつナンバーを格納したバイナリファイルを作るとしましょう。
一人目の人のナンバー二人目の人のナンバー三人目の人のナンバーと連続で入っているとして、その中から3人目の人のナンバーだけ変数 int num にとり出せと言われたらどうしますか?
一人目の人のナンバー二人目の人のナンバー三人目の人のナンバーと連続で入っているとして、その中から3人目の人のナンバーだけ変数 int num にとり出せと言われたらどうしますか?
Re:ファイルの読み込み書き込み
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と出てくる。。やっぱり、何処から読み込みはじめてるのか・・・。もやもやする。。
[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と出てくる。。やっぱり、何処から読み込みはじめてるのか・・・。もやもやする。。
Re:ファイルの読み込み書き込み
fseek(fp,4,SEEK_SET)だと
[0][1][2][3][4][5][6][7][8][9] 添え字
[2][3][4][5][6][7][8][9][10] 値
こうなります。
[0][1][2][3][4][5][6][7][8][9] 添え字
[2][3][4][5][6][7][8][9][10] 値
こうなります。
Re:ファイルの読み込み書き込み
みなさんお久しぶりです。ファイルはだいぶできるようになったのですが、またまたつまずいています。
書き込みのコード
読み込みのコード
うまく読み取れないのです。。
書き込みのコード
#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; }
うまく読み取れないのです。。
Re:ファイルの読み込み書き込み
miyazaさんお久しぶりです。毎回アドバイスありがとうございます。無事読み取りできました!!
少しずつではありますが、コードが書けるようになってきました。関数の引数なども調べればなんとかなってきています。だが、小さなミスが多すぎますね~自分の場合。
少しずつではありますが、コードが書けるようになってきました。関数の引数なども調べればなんとかなってきています。だが、小さなミスが多すぎますね~自分の場合。
Re:ファイルの読み込み書き込み
今、バイナリファイルに文字列を書き込み、ランダムアクセスで特定の文字列を読み取ろうとしているのですが、苦戦中です。。なぜか、ファイルはできているのに書き込まれていないのです。。
C:\vc\RA_test2\rw_ex01.c(14) : error C2059: 構文エラー : ']'とでてしまいます。
#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: 構文エラー : ']'とでてしまいます。
Re:ファイルの読み込み書き込み
治してみました。確かにコンパイル実行もできました。ファイルには、hとしか書き込まれていませんでしたが、これでいいのでしょうか?一応、バイナリ形式で書き込んだつもりなのですが・・・
Re:ファイルの読み込み書き込み
そうですか。。もう一度試してみます!!
後、バイナリ形式で書き込んでいるので、普通は人間が見ても分からないような感じで書き込まれているのではないですか?普通にhelloと書き込まれていてもいいものなのでしょうか??
後、バイナリ形式で書き込んでいるので、普通は人間が見ても分からないような感じで書き込まれているのではないですか?普通にhelloと書き込まれていてもいいものなのでしょうか??
Re:ファイルの読み込み書き込み
もう一度コンパイルしたらエラーが出てしまいますね。。
Debug/RRA_test.exe : fatal error LNK1120: 外部参照 1 が未解決です。
#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 が未解決です。
Re:ファイルの読み込み書き込み
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:ファイルの読み込み書き込み
IBCD.lib(crt0.obj) : error LNK2001: 外部シンボル "_main" は未解決です
Debug/RRA_test.exe : fatal error LNK1120: 外部参照 1 が未解決です。
のエラーが解決できないですね・・・・。
Debug/RRA_test.exe : fatal error LNK1120: 外部参照 1 が未解決です。
のエラーが解決できないですね・・・・。
Re:ファイルの読み込み書き込み
使っているのはVCですか?
だったらプロジェクトの設定がまずかったんだと思います。
もう一回プロジェクトから作り直してみてはどうでしょう。
main()がないと起こるエラーですが。
だったらプロジェクトの設定がまずかったんだと思います。
もう一回プロジェクトから作り直してみてはどうでしょう。
main()がないと起こるエラーですが。
Re:ファイルの読み込み書き込み
解決できました!!コンパイル実行もできました。ファイルにはhelloと書き込まれていました!!
バイナリファイルなのに、helloと書き込まれてていいのでしょうか?普通だったら、数字とかで書き込まれて
いるはずだと思うのですが。ちなみに、バイナリエディタというものはもっていないので普通のメモ帳を使用しています。
バイナリファイルなのに、helloと書き込まれてていいのでしょうか?普通だったら、数字とかで書き込まれて
いるはずだと思うのですが。ちなみに、バイナリエディタというものはもっていないので普通のメモ帳を使用しています。