🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
Visual Studio

Microsoft Visual StudioはMicrosoftによる統合開発環境(IDE)です。多種多様なプログラミング言語に対応しています。

while

Whileは多くの言語で使われるコントロール構造であり、特定の条件が満たされる限り一連の命令を繰り返し実行します。

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

Q&A

解決済

4回答

1712閲覧

C++ 2重While文でテキストファイルを開こうとすると,途中で開けなくなる

BASEBALL-Y

総合スコア67

Visual Studio

Microsoft Visual StudioはMicrosoftによる統合開発環境(IDE)です。多種多様なプログラミング言語に対応しています。

while

Whileは多くの言語で使われるコントロール構造であり、特定の条件が満たされる限り一連の命令を繰り返し実行します。

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

0グッド

1クリップ

投稿2020/11/26 14:50

編集2020/11/27 01:09

質問内容

  • 2重while文でテキストファイルを開こうとすると,途中でファイルが開けなくなります.
  • 今回使うテキストファイルは,3000行3列で,1000枚近くあります.
  • i = 500 付近ででテキストファイルが開けなくなります.(以下のコードより)
  • クローズ(close(fp);)しています.

原因が分かる方がいましたら,回答して頂けると幸いです.

簡略化したコード

C++

1#define MAX_BUFFER_SIZE 1024; 2 3 4int i; 5 6 7while (1) 8{ 9 FILE *fp; 10 11 fopen_s(&fp, (to_string(i) + ".txt").c_str(), "rt"); 12 13 14 15 16 char fp_BUFFER[MAX_BUFFER_SIZE]; 17 18 while (1) 19 { 20 if (fgets(fp_BUFFER, MAX_BUFFER_SIZE, fp) != NULL) 21 { 22 sscanf_s(fp_BUFFER, "%lf\t%lf\t%lf\n", &x, &y, &z); 23 } 24 else 25 { 26 fclose(fp); 27 break; 28 } 29 30 31 } 32 33 34 35 i++; 36 37 38 if (i == 1000) 39 { 40 break; 41 } 42 43}

イメージ図

イメージ説明

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

ozwk

2020/11/27 01:40

コードを省略して貼るときは、 省略したコードでも問題が発生することを確認してから貼ってください
tmp

2020/11/27 03:07

「ファイルが開けなくなります」とは、fopen_sでエラーになるということですか?それとも処理が進まなくなるということですか? 「500付近」とは、毎回500付近の同じ数でとまるのですか?実行するごとに500付近で、ばらつきがあるということですか?
BASEBALL-Y

2020/11/27 03:31

正確には毎回,506番目で処理が進まなくなります. 『fp==NULL』になってしまいます.
dodox86

2020/11/27 06:31

ozwkさんが書かれているように、簡略化した最低限のコードでも問題が再現することを確認したのち、そのコードを全文、載せてください。簡略化したコードで問題が再現しないようであれば他回答で示されているように、別の部分に問題がある可能性が高いです。fopen_s のerrno_t型の返り値でエラーの詳細が分かるのでそちらも確認し、問題部分を切り分けてください。 https://docs.microsoft.com/ja-jp/cpp/c-runtime-library/reference/fopen-s-wfopen-s?view=msvc-160
YT0014

2020/11/27 10:13

該当するファイルは、ちゃんとあるのでしょうか?506.txt、507.txtが該当のフォルダに存在していることをご確認ください。
BASEBALL-Y

2020/11/28 05:19

返信遅れてしまい申し訳ございません. 506.txt、507.txtとそれ以降のファイルも存在しています.
YT0014

2020/11/28 05:43

x,y,zの宣言がありませんので、追記してください。 また、506.txt前後のファイルを開き、データが仕様通りに格納されているか、ご確認ください。 加えて、iの初期値を500にした場合の動作も、ご確認ください。 500からでも506で止まるようなら、繰り返しとは無関係と判断できますので。
YT0014

2020/11/28 14:47

ベストアンサーを選ばれておられますが、原因は何だったのでしょうか? 簡単なコメントで構いませんので、その辺りをご説明頂ければ幸いです。
BASEBALL-Y

2020/11/28 14:51

2重while文では,テキストファイルを最後まで開くことが出来ました.3重のwhile文でテキストファイルを開く際に途中で開くことが出来ないことに気づき,また別で質問しようと思い,ベストアンサーを選ばさせて頂きました. ご迷惑をおかけして申し訳ございません.
YT0014

2020/11/29 05:08

質問の文章が悪かったようで申し訳ありません。 「2重while文で、途中でファイルが開けなくなる」という不具合は、なんらかの修正で解消された、ということで、よろしいでしょうか? その不具合は、どのような原因で発生していて、どのように修正して、解消されたのでしょうか? それとも、そもそも、「2重while文で、途中でファイルが開けなくなる」という認識が誤りだった、ということでしょうか?
BASEBALL-Y

2020/11/29 05:30

すみません。 そもそも2重while文で途中でファイルが開けなくなるという認識が誤りでした。
guest

回答4

0

ベストアンサー

以下をチェックしてください.

ファイルが開けなくなります

fopen_s()が失敗するということであれば,その戻り値から原因を推測できないのでしょうか?
(単純にその名前のファイルが無いとか,今現在開けない状態にあるだとか.)

クローズ(close(fp);)しています.

fclose()だと思いますが,そのクローズ処理は成功しているのでしょうか?
クローズに失敗するようであれば,
fpの値がfopen_s()~fclose()の間に何かしらの要因によって変化してしまっていたりしないかを確認してください.
(例えば,読書用に用意したバッファに対してバッファオーバーランみたいなことが起こって,fpの値をぶっ壊しているとか…)

投稿2020/11/27 02:43

fana

総合スコア11985

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

1つのプロセスが同時にオープンできるファイル数には上限があります。
(=オープンしたがクローズしていないファイルの数)
上限はOSや設定に依りますが、例えば1024とか。

500位で駄目と言うことは、その環境では500くらいが上限なんでしょう。

投稿2020/11/26 15:00

編集2020/11/26 15:04
otn

総合スコア85888

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

BASEBALL-Y

2020/11/26 15:31

クローズ(close)している場合、オープンできるファイル数に上限はありますでしょうか?
otn

2020/11/26 15:33

制限があるのは、オープンしたがクローズしていないファイルの数だけです。
BASEBALL-Y

2020/11/26 23:28

すみません. 今回,クローズ(close(fp);)をした状態で,500番目くらいでファイルが開けなくなったのですが,これは何が原因なのでしょうか? 何度も質問をして申し訳ないです.
ozwk

2020/11/27 00:43 編集

(修正前のコードについて話していたので編集)
dodox86

2020/11/27 01:15 編集

[別回答で指摘済みだったので削除]
otn

2020/11/27 01:54

> 今回,クローズ(close(fp);)をした状態で, 別の回答のコメントからすると、「fclose(fp)を下状態で」の書き誤りということでしょうか? > これは何が原因なのでしょうか? プログラムが間違っているのでしょう。としか言い様がないです。 正しく書けば大丈夫です。
guest

0

FILE *fp;
fopen_s(fp, (to_string(i) + ".txt").c_str(), "rt");

fopen_s の第一引数は FILE** だから fopen_s(**&**fp ... ) じゃないのかしら

投稿2020/11/27 01:07

episteme

総合スコア16612

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

BASEBALL-Y

2020/11/27 01:09

epistemeさん. すみません. 記述ミスです.
dodox86

2020/11/27 01:17

@BASEBALL-Yさん ちゃんと転記しましょう。回答が振り回されます。その他、もとのコードと比べて重要な部分で転記ミスがあるのではありませんか?
BASEBALL-Y

2020/11/27 02:59

転記の件,申し訳ございませんでした.
guest

0

FILEを閉じる関数はfcloseです。closeではありません。

投稿2020/11/27 01:03

yuki23

総合スコア1448

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

BASEBALL-Y

2020/11/27 01:05

すみません. 記述ミスです.
yuki23

2020/11/27 01:17

> BASEBALL-Y なぜこんな重要なところを何箇所も間違えるのでしょうか? 適当に省略せず、実際に問題が発生するコードを貼り付けてください
BASEBALL-Y

2020/11/27 02:58

すみませんでした.
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.36%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問