番号のついたデータ群を処理するつもりです。
例えば、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
以上
No.2ベストアンサー
- 回答日時:
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でエラー処理…という書き方する方が多いですね。
教えていただいたやり方を参考にして、なんとかforとif,
elseですっきりしたプログラムを書くことができました。ありがとうございます。
No.4
- 回答日時:
そういう時には、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;
}
No.3
- 回答日時:
既に回答があるように、goto は使わなくても処理できますし、そのために、if には else というものがあるということです。
ただ、提示されたプログラムが、Error:cannot open input file で止まるというのは、ちょっと別の問題で、「オープンに失敗したファイルをクロース使用とすると、ものによっては、おかしな事が起こる」と、そういう取り決めになっているので、おそらくそれが直接の原因だと思います。
なので、label2: を、fclose() の後ろに持って行けば、とりあえず、動くのではないかと思います。
※もちろん、この場合なら、goto を使わない書き方が主流です。
Error cannot open file はという文はダテではないのですね。C言語というものは奥が深いと思います。ありがとうございました。
No.1
- 回答日時:
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;
でいいかな
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- C言語・C++・C# c言語の問題の説明、各所ごとに 5 2023/07/26 11:03
- C言語・C++・C# プログラミングの授業の課題です 1 2023/01/17 22:15
- C言語・C++・C# このプログラミング誰か教えてくれませんか 1 2022/06/02 15:27
- CGI htmlからパラメータで、cgiに渡したい。 1 2023/02/06 16:15
- C言語・C++・C# バイナリファイルをコピーするのにかかる時間を測りたいのですが実行するとFatel error:gli 2 2022/11/03 01:10
- C言語・C++・C# c言語の問題です 3 2023/01/10 16:15
- C言語・C++・C# #include <stdio.h>int main(void) { int buf[100] = 6 2022/11/01 22:45
- JavaScript アップロードファイルの種類によって処理を分岐させたいのですが書き方が分からずアドバイスお願いします 4 2023/06/17 19:12
- Excel(エクセル) Excelにて、フォルダ内のTextファイルをマクロで統合すると文字化けしてしまう時の解消コード 4 2023/01/01 07:32
- その他(プログラミング・Web制作) python 2 2022/12/23 09:06
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
window.open でのファイル指定方法
-
カップ麺について
-
AutoNts
-
VBA テキストファイルを読み取...
-
巨大なテキストの最終行を取得...
-
VBAコードを張り付け後のエクセ...
-
複数ファイルを1つにするシェ...
-
python renameについて
-
awkスクリプトでダブルクォーテ...
-
VBAでCSVファイルの特定行を書...
-
VBAでCSVファイルを途中行まで...
-
batファイルでrenameができませ...
-
【エクセル】改行無しテキスト...
-
Perlで特定文字列から特定文字...
-
perlのflock関数でロックをかけ...
-
close()で例外が投げられる理由
-
ExcelをCSV書き出す場合のシー...
-
Perl で ディレクトリ及びサブ...
-
バッチファイルの作り方(CSV→...
-
vba dir の相対パス
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
window.open でのファイル指定方法
-
python renameについて
-
ファイル全てを .xlsm に変更し...
-
JSP URLに表示される拡張子 .jsp
-
csvファイルの横方向への改行に...
-
fgets で値が取得できない
-
巨大なテキストの最終行を取得...
-
VBA テキストファイルを読み取...
-
DNSサーバ(BIND)がうまく動き...
-
行を指定して削除する方法PERL
-
VBAコードを張り付け後のエクセ...
-
ファイルの存在の有無を確かめ...
-
Firefox で file:// で始まる U...
-
foreach内での変数の扱い?
-
MySQLにバイナリデータを正常に...
-
重複ファイル名ある場合ファイ...
-
fopen64について
-
複数ファイルを1つにするシェ...
-
perlでMail::Mbox::MessagePars...
-
drtファイルはどうしたら開...
おすすめ情報