- ベストアンサー
急にプログラムが正しく動かなくなってしまった
Macのターミナルでcのプログラムを動かしています。 今まで使えていたプログラムが、突然うまく動かなくなりました。 原因が分からないのですが、どなたかアドバイスいただけないでしょうか? プログラムは、 1)ファイル名のリストを読み込んで、 2)読み込んだ名前のバイナリファイルを全て開き 3)それらのファイルからデータを読み込んで処理 というものです。 このプログラムは同じパソコン上でもともと正しく動いていたのですが、あるとき突然、2)の段階で一部のファイルが開けなくなってしまいました。 原因を探るために、ファイルを開いて閉じるだけのプログラムに削ってみましたが、やはり症状は変わりませんでした。 同じプログラムを、別のパソコン(windows+cygwin)にコピーしてみると、ちゃんと動きます。使用中のMacに何か問題があるのかなとおもうのですが、原因が分かりません。 詳しい状況と、開いて閉じるだけの状態に削ったプログラムを以下にのせておきます。どなたか原因が分かる方、ぜひアドバイスをお願いします。 [状況] ・上記2で開きたいバイナリファイルは332個あるのですが、253個しか開けず、それ以降はCannot open (ファイル名)のメッセージが出ます(そういうメッセージを出すようなプログラムにしてあります) ・上記2でfopenの前に、これから開くファイル名を表示させてみると、ファイル名は全て正しく読み込めています。 ・開きたいバイナリデータファイルが壊れていることを想定し、バックアップからコピーし直してみましたが、やはり症状はかわりません。 ・ for (i = 0; i < FILE_NUM; i++) をつかって複数ファイルを開いていますが、最初をi=0とすると1個目から253個目までしかファイルが開けず、最初をi=1とすると、2個目から254個目のファイルまで開けますが、それ以降のファイルはやはり開けません。どういう訳か、253個だけしかファイルが開けないのです。 [プログラム] #include <stdio.h> #include <stdlib.h> #include <string.h> #define FILE_NUM 332 #define DataDir "../N2913S5601W2689E4705" #define FileList "list_BISE3.txt" #define BUFFER 256 main() { char fn[FILE_NUM][BUFFER]; FILE *fp[FILE_NUM], *fi; char buffer[BUFFER]; unsigned short i; char *p; fi = fopen(FileList, "r"); if (!fi) { printf("Cannot Open %s\n",FileList); exit(1); } for (i = 0; i < FILE_NUM; i++) { p = fgets(buffer, BUFFER, fi); if (!p) { break; } p = strchr(buffer,'\n'); if(p != NULL) { *p = '\0'; } sprintf(fn[i], "%s/%s", DataDir, buffer); printf("%s_\n",fn[i]); fp[i] = fopen(fn[i], "rb"); if (!fp[i]) { printf("Cannot Open %s\n", fn[i]); continue; } } fclose(fi); for (i = 0 ; i < FILE_NUM; i++) { fclose(fp[i]); } }
- みんなの回答 (2)
- 専門家の回答
質問者が選んだベストアンサー
その他の回答 (1)
- asuncion
- ベストアンサー率33% (2127/6289)
> 253個しか開けず 以下は、推測です。当たっているかどうかはわかりません。 253個という数値から、一度に開けるファイル数の制限に 引っかかっているのではないかと思いました。 標準入力、標準出力、標準エラー出力の分とあわせて256個(2の8乗)というのは、 コンピューターの世界ではいかにもありそうな数値です。 もし、当該のファイル群を開きっぱなしにしておく必要がないのであれば、 1個ずつ開いて処理して閉じる、を繰り返せば、その制限(あるとすれば、ですが)に 引っかからなくなるのではないかと思います。推測です。
お礼
No1の方の回答にもありましたが、おっしゃる通り、開けるファイル数を超えてしまっているんですね。 複数ファイルから、それぞれ一定量ずつ読み込んで処理、というのを繰り返すプログラムなのですが、いちいちファイルを閉じていると、開く度に位置指示子を移動してやらなくてはいけないので、処理に時間がかかりそうだなと思ったんです。開きっぱなしにしておけば、いちいち位置指示子を移動させる必要ないじゃないか!と思ったんですが、、、そうは問屋がおろさないんですね。 浅はかでした。。。T.T 回答ありがとうございました。
お礼
winows+cygwinで開くから問いって、Macでも可という訳ではないのですね。 ありがとうございました。