プロが教えるわが家の防犯対策術!

番号のついたデータ群を処理するつもりです。
例えば、1から10000まで欠損が存在しなければ
for文で処理できます。
ただし、番号の欠損があればそこで止まってしまいます。
番号の欠損があっても処理ができるようにしたいです。

そこで、あまり使いたくないのですがgotoの使用を検討し、
下記のプログラムを作成しました。
動作は単に1.txt から5.txtまでの入力ファイルを開いて、
標準出力に入力ファイル名を出力して、閉じるだけです。
あえて4.txtは除いてあります。
1、2、3、5となり、4が欠損しています。

gotoで4をスキップしたいのですが、うまくいきません。
どなたかやりかたを教えてください。

もし、gotoを使わずにスキップできるのであれば
その手法も教えてください。

program

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

int main(void){
FILE *fi,*fo;
int i;

for( i = 1; i <= 5; i++){
char input_file[32];
sprintf(input_file,"./testin/%d.txt",i);
if((fi = fopen(input_file,"r")) == NULL){
puts("Error:cannot open input file \n");
goto label2;
}
printf("input_file=%s\n", input_file);
label2:
fclose(fi);

}
return 0;
}

inputfile
./testin/1.txt
./testin/2.txt
./testin/3.txt
./testin/5.txt

./testin/4.txtは存在しない

stdoutput

input_file=./testin/1.txt
input_file=./testin/2.txt
input_file=./testin/3.txt
Error:cannot open input file

以上

A 回答 (4件)

for( i = 1; i <= 5; i++){


 sprintf(input_file,"./testin/%d.txt",i);
 if((fi = fopen(input_file,"r")) == NULL){
  puts("Error:cannot open input file \n");
 } else {
  printf("input_file=%s\n", input_file);
  fclose(fi);
 }
}

ではダメなんでしょうか?
# if文の条件を逆にするかどうかは…好みの問題ですかねぇ。
# 私の場合は、失敗の時にelseでエラー処理…という書き方する方が多いですね。
    • good
    • 0
この回答へのお礼

教えていただいたやり方を参考にして、なんとかforとif,
elseですっきりしたプログラムを書くことができました。ありがとうございます。

お礼日時:2014/09/16 15:30

そういう時には、continueです。


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

int main(void){
FILE *fi,*fo;
int i;


for(i=1;i<=5;i++){
char input_file[32];

sprintf(input_file,"./testin/%d.txt",i);
if((fi=fopen(input_file,"r"))==NULL){
puts("Error:Cannot open input file\n");
continue;
}
printf("input_file=%s\n",input_file);
fclose(fi);
}

return 0;
}
    • good
    • 0

既に回答があるように、goto は使わなくても処理できますし、そのために、if には else というものがあるということです。



ただ、提示されたプログラムが、Error:cannot open input file で止まるというのは、ちょっと別の問題で、「オープンに失敗したファイルをクロース使用とすると、ものによっては、おかしな事が起こる」と、そういう取り決めになっているので、おそらくそれが直接の原因だと思います。

なので、label2: を、fclose() の後ろに持って行けば、とりあえず、動くのではないかと思います。

※もちろん、この場合なら、goto を使わない書き方が主流です。
    • good
    • 0
この回答へのお礼

Error cannot open file はという文はダテではないのですね。C言語というものは奥が深いと思います。ありがとうございました。 

お礼日時:2014/09/16 15:33

for( i = 1; i <= 5; i++){


 char input_file[32];
 sprintf(input_file,"./testin/%d.txt",i);
 if((fi = fopen(input_file,"r")) == NULL){
  puts("Error:cannot open input file \n");
 }
 else{
  printf("input_file=%s\n", input_file);
 }
 fclose(fi);
}
return 0;

でいいかな
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!