ページ 11

ファイル名の一部に数字が入ったファイルをfor文で読み込む

Posted: 2016年11月17日(木) 15:43
by りん
ファイル名の一部に数字が入ったファイルを読み込む際に、for文でまわしてすべて読み込むようなコードを書きたいのですがうまくいきません。
例えばa1.txt, a2.txt, a3.txt というファイルがあったとして、

コード:

void main()
{
 int i;
 char* fname;

 for(i=1;i<=3;i++){
  sprintf(fname,"a%d.txt",i);
  //fnameのファイルを開いてなんらかの処理
  }
}
このように書いたのですが
The variable 'fname' is being used without being initialized.
というエラーがでてきます。おそらくfnameにうまくファイル名が代入できてないと思われるのですが、どのようにすれば
代入できるのでしょうか?sprintfを使えばできるというような内容を見かけたので使ってみましたがこれではできないのでしょうか?

教えていただけると幸いです。
言語はcまたはc++でお願いします。

Re: ファイル名の一部に数字が入ったファイルをfor文で読み込む

Posted: 2016年11月17日(木) 16:05
by みけCAT
メッセージにある通り、fnameが初期化されていないので、この場合fnameは自動変数なので値は不定であり、使用すると未定義動作になります。
fnameに有効なバッファへのポインタを代入するといいでしょう。

また、特殊な環境(組み込みなど)向けのコードを書く、使わないと(理不尽に)学校の試験で減点される、など特に使いたい理由があるのでなければ、
void main()は標準ではないので使うべきではありません。
void main()をめぐるどうでもいい話 - Qiita

C言語の場合

コード:

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

int main(void)
{
 int i;
 char* fname;
 fname = malloc(32); // 十分大きな領域を確保する
 if(fname==NULL){
  perror("malloc");
  return 1;
 }

 for(i=1;i<=3;i++){
  sprintf(fname,"a%d.txt",i);
  //fnameのファイルを開いてなんらかの処理
 }

 free(fname); // 領域を解放する

 return 0;
}
C++の場合

コード:

#include <cstdio>
#include <cstdlib>

int main(void)
{
 int i;
 char* fname;
 fname = new char[32]; // 十分大きな領域を確保する

 for(i=1;i<=3;i++){
  sprintf(fname,"a%d.txt",i);
  //fnameのファイルを開いてなんらかの処理
 }

 delete[] fname; // 領域を解放する

 return 0;
}
また、領域をわざわざ動的確保するのではなく、最初から配列を用意してもいいでしょう。

コード:

#include <stdio.h>

int main(void)
{
 int i;
 char fname[32]; // 十分大きな領域を確保する

 for(i=1;i<=3;i++){
  snprintf(fname,sizeof(fname),"a%d.txt",i); // バッファの大きさを指定できるsnprintfの方が安心
  //fnameのファイルを開いてなんらかの処理
 }

 return 0;
}

Re: ファイル名の一部に数字が入ったファイルをfor文で読み込む

Posted: 2016年11月17日(木) 22:59
by りん
領域確保ができてなかったということですね…
void main()の話も含めてありがとうございました。