• ベストアンサー

ファイル名を複数個配列で確保したいときどうすればいいですか?

int i; FILE *fp[5]; //ここの宣言がわかりません char *(filename[5])={"1.txt","2.txt","3.txt","4.txt","5.txt}; for(i=0;i<5;i++) fp[i]=fopen(filename[i],"w"); のようなことをしたいのですが、ファイル名を複数個配列に格納するにはどのようにしたらいいんでしょうか? 回答お願いします。

質問者が選んだベストアンサー

  • ベストアンサー
  • jacta
  • ベストアンサー率26% (845/3158)
回答No.1

const char * const filename[5] ={ "1.txt","2.txt","3.txt","4.txt","5.txt" }; でよいのでは?

moca12980
質問者

お礼

すいません。勘違いだったみたいで↓でうまくいきました。 typedef struct file{ FILE *fp; char *filename; }sFILE; sFILE fp[5]; char *name[5]={"1.txt","2.txt","3.txt","4.txt","5.txt"}; for(i=0;i<5;i++){ fp[i].fp=NULL; fp[i].filename=name[i]; }

moca12980
質問者

補足

回答ありがとうございます。 回答いただいた方法だと上手くいったんですが、質問には書いてなかったんですがファイルポインタを構造体にしていて、 typedef struct file{ FILE *fp; char *filename; }sFILE; sFILE fp[5]; const char * const name[5]={"1.txt","2.txt","3.txt","4.txt","5.txt"}; for(i=0;i<5;i++){ fp[i].fp=NULL; fp[i].filename=name[i];//← } としたかったんですが、構造体にすると//←の部分でエラーになってしまいます。 この場合どのようにしたらいいのでしょうか?

その他の回答 (1)

  • MasamiH
  • ベストアンサー率21% (13/61)
回答No.2

"オープンしたい"ファイル名(文字列)の配列とオープンしたファイルへのポインタの配列とは別物ですよ。 FILE *fp はオープンしたファイルへのポインタを格納しますからファイル名("1.txt")への文字列ポインタではありません。 ですので、 char filename[ ] = { "abc.txt", "def.txt"などなど }; FILE *fp[ 5]; という具合に二つの配列を宣言しておいて、 for ( ... ) fp[i] = fopen( filename[i], ..... )

関連するQ&A

  • ファイル名を複数個配列で確保したいときどうすればいいですか?

    先ほど似た質問をしたのですが、勘違いしていたので質問しなおさせてください。 typedef struct file{ FILE *fp; char *filename; }sFILE; sFILE fp[5]; for(i=0;i<5;i++){ fp[i].fp=NULL; sprintf(fp[i].filename,"file(%d).txt",i); } とsprintfでファイル名を確保したいんですが、 sprintf(fp[i].filename,"file(%d).txt",i); の第一引数がこれではダメなようです。 なんとなく、ダメなのは分かるんですがアドレスについてなど分からないことが多くどうしたらいいのかわかりません。 アドバイス等お願いします。

  • 画像を読み込む配列の確保。

    C言語について質問です。 画像を読み込む時、その画像の幅、高さを入力し、そのサイズに見合った配列を確保します。その後ファイル名を入力し、配列に読み込むプログラムを作成しました。 メインの部分のみ記述します。 int xsize, ysize, i; unsigned char **src; char filename[30]; FILE *fp; printf("ファイル名を入力してください:"); scanf("%s", filename); printf("画像の幅:");scanf("%d", &xsize); printf("画像の高さ:");scanf("%d", &ysize); src = (unsigned char **)malloc(sizeof(unsigned char *) * ysize); for(i=0; i<ysize; i++) src[i] = (unsigned char *)malloc(sizeof(unsigned char) * xsize); fp = fopen(filename, "rb"); fread(src[0], sizeof(unsigned char), xsize * ysize, fp); このように記述し、エラーもなく実行できたのですが、srcをこのまま出力すると変?な画像となって出力されてしまいました。 上のように記述した場合、矛盾する場所はあるでしょうか? そして、この方法以外に配列を確保する方法はあるでしょうか?

  • 配列のサイズ変更

    FILE *fp; char *fname = "test.txt"; unsigned char init[300]; int i = 0; int c; fp = fopen( fname, "r" ); if( fp == NULL ){ printf( "%sファイルが開けません\n", fname ); return -1; } while( (c = fgetc( fp )) != EOF ){ init[i] = c; i = i+1; } fclose( fp ); 自分のプログラムの中のこのようなテキストから文字を読んで配列に格納するような動作の中で、initを大きめにとっておいて配列に格納し終わったら余った空の配列を削除する、という機能を拡張したいのですがどのようにすればいいかわかりません。 どなたか教えていただけないでしょうか?

  • 配列のメモリの確保

    先日メモリについてご質問させていただいたものですが、 今ファイルから読み込んだ文字列を配列に格納する作業を行なっています。 今は char buf[1000]; FILE fp; if((fp=fopen("○○.txt","r")) ==NULL){ printf("ファイルが開けません"); } while(fgets(buf,1000,fp) != NULL){ としてファイルを一行ずつ読み込んでその後単語ごとに配列に組み込みます このときファイルの文字列を格納する配列はbuf[1000]ですが このメモリでは足りないかもしれませんし多すぎるかもしれません。 足りない場合はエラーになるし多すぎる場合はメモリの無駄ですよね。 このような場合はメモリを取り直すべきなのでしょうか?その場合 どのような方法がありますか?調べてもint型の領域確保とかそういうのはあるんですがファイルから読み込んだ文字列の領域確保とかは見つからなかったので教えて下さい。

  • txtファイルの文字を配列に格納

    ファイル関数を使ってoutput.txt(txtファイル)の文字を配列に格納するプログラムを作っているのですが、配列に文字を入れられない状態です。 ※参考になるページやアドバイスがあれば宜しくお願い致します。 ■プログラム #include <stdio.h> void main(){ int i; int data[10]; FILE *fp; fp = fopen("output.txt","r"); if(fp == NULL){ printf("ファイルが見つかりません。"); }else{ for(i=0;fp != EOF;i++){ data[i] = fgetc( fp ); } } } ■output.txt 001 100 猫A 好きな物 ねこまんま 002 200 猫B 好きな物 キャットフード

  • 複数テキストファイルを読み込み、複数テキストファイルの出力

    質問は100個のテキストファイル(それぞれ10個のデータを含む)を読み込み、それぞれのテキストファイルから5個ずつデータを抽出し、200個のテキストファイルとして出力するというプログラムについての質問です。 以下が僕の作ったファイル出力部分のプログラムです。 /************/ void ecg_rr(fp,data_max) FILE *fp; { int b,i=0; int c=1; char fname[64]; data[0][i]=trend_data[0][i]; for(i=0;i<100;i++) sprintf(fname,"ss[%d].txt",1+i); fp = fopen(fname,"w"); fprintf(fp,"%4d\n",c); fprintf(fp,"%8.8f\n",data[0][0]); fprintf(fp,"%8.8f\n",data[0][2]); fprintf(fp,"%8.8f\n",data[0][4]); fprintf(fp,"%8.8f\n",data[0][6]); fclose(fp); sprintf(fname,"sk[%d].txt",1+i); fp = fopen(fname,"w"); fprintf(fp,"%4d\n",c); fprintf(fp,"%8.8f\n",data[0][1]); fprintf(fp,"%8.8f\n",data[0][3]); fprintf(fp,"%8.8f\n",data[0][5]); fprintf(fp,"%8.8f\n",data[0][9]); fclose(fp); } 複数ファイルの読み込み方がわからず、自分のプログラムだと1つのテキストファイルしか読み込めないので、16_4.batを作り、その中身を 16_4 読み込むテキストファイル名1.txt ss[1] 16_4 読み込むテキストファイル名1.txt sk[1] 16_4 読み込むテキストファイル名2.txt ss[2] 16_4 読み込むテキストファイル名2.txt sk[2] ・・・ とやったのですが、うまくいきませんでした。 どうすればよいのでしょうか。

  • 段落毎に配列に挿入するには?

    C++の基本的な配列でわからないことがあります。 例えば以下のような,3段落があるテキストファイルを用意しておき, -------------- //abc.txt abcde fghij klmno -------------- 用意した配列char data[3][20]へ, 上から順番にdata[0]に"abcde",data[1]に"fghij",data[2]に"klmno"を挿入したいです。 とりあえず1行だけ,以下のようなプログラムで出力表示できました。 #include <string> #include <iostream> using namespace std; int main() { char cir_data[3][20]; string filename("abc.txt"); FILE* fp = fopen( filename.c_str(), "r" ); fgets(data[0], 20, fp); cout << data[0] << endl; fclose(fp); return 0; } 結果は, -------------------- abcde -------------------- となったので,2・3番目もforループでできるかなと思ったら,良い結果が出ません。 以下は間違えているプログラムです。 int main() { char cir_data[3][20]; int i; string filename("abc.txt"); FILE* fp = fopen( filename.c_str(), "r" ); for(i=0; ; ){ fgets(cir_data[i], 20, fp); if(strlen(cir_data[i])<3) break; if(cir_data[i][0] != '/') i++; cout << cir_data[i] << endl; } fclose(fp); cout << "i = " << i << endl; return 0; } 結果は文字化けしてます。 何回ループしたか,iも出力してみましたが,なぜか6回カウントされています。 どこが誤っているのかわからず困っています。

  • 動的に確保した配列のファイルへの書き出し

    動的に確保した配列を、ファイルに書きだそうとしています。 int i, arraysize = 10; int **array; array = new int*[ arraysize ]; for (i = 0 ; i < arraysize ; i++) array[ i ] = new int [ arraysize ]; ofstream out("filename", ios::out | ios::binary); out.write((char *) array, sizeof( array )); これでは array のポインタが書き込まれるだけ、なのかな ? ということで、配列を書き込む目的を果たせておりません。このように動的に確保した多次元配列 (要素数は既知) をファイルに書き込むためにはどうすればよろしいでしょうか。

  • fopen関数について

    ----------------------------------------- #include<stdio.h> #include<stdlib.h> int main() { FILE *fp; char filename[80],ss[256]; printf("ファイル名="); gets(filename); if((fp=fopen(filename,"r"))==NULL){ printf("ファイルをオープンできません.\n"); exit(1); } while(fgets(ss,256,fp)!=NULL){ printf("%s",ss); } puts(""); fclose(fp); return 0; } ----------------------------------------- 初心者な内容の質問ですいません。 以上のプログラムでまず、「gets(filename);」により、「filename[80]」の配列に「aaa.txt」という文字列を格納し、そのファイルをfopenで読もう込もうとしています。 そこで、 if((fp=fopen(filename,"r"))==NULL) の部分に疑問があるのですが、「filename」という配列名だけで中身の「aaa.txt」と何故認識できるのでしょうか? 配列名ということで、先頭アドレスのみの情報しかないと思いました。 教えていただければ嬉しいです。

  • 大量のファイルの読み込みについて

    -512.txt~512.txtのファイルを順に読み込むプログラムを 作っています。 以下のコードのように作って動かしてみたのですが, -512から-3.txtまで入力してくれるのですが -2.txtの所でエラーが起きてしまいます. ファイルは確実に存在するのですが… fopenには大量のファイルを読み込むのは向いてないのでしょうか? 他に良い方法があれば教えて頂けると幸いです. 宜しくお願いします #include <stdio.h> #include <stdlib.h> int main(void) { FILE *fp; int i=0; char s[256]; char filename[256]; //ファイル名編集 for(i=-512;i<512;i++){ fp=NULL; sprintf(filename,"distance\\routing_a\\%d.txt",i); printf("%sを読み込みます\n",filename); /* ここで、ファイルポインタを取得する */ if ((fp = fopen(filename, "r")) == NULL) { printf("%s file open error!!\n",filename); exit(EXIT_FAILURE); /* (3)エラーの場合は通常、異常終了する */ } } fclose(fp); /* (5)ファイルのクローズ */ return 0; } 環境 OS:windows XP 開発環境 visual studio 2008

専門家に質問してみよう