C言語のfopenについて教えてください。
ある1つのファイルをr(テキストファイル読み込みモード)でfopenしたとします。
そのファイルをfcloseする前に、同じファイルが再度rモードでfopenされても問題ないのでしょうか?
何を気にしているかと言いますと、あるプログラムであるファイルをrモードでfopenして読み込む処理があるのですが、そのプログラムを呼び出す処理が複数あります。
確率は低いと言えど、もし同時にその処理が実行された場合、rモードでfopenしているファイルにfclose前に再度rモードのfopenがされたらエラーとなってしまうのでしょうか?
もし、エラーとなる場合、回避する方法がありますか?
また、エラーとならない場合は、fcloseするまで次の処理が待ってしまうのでしょうか?
読み込みモードだから問題ないのかなとも思ったのですが、どなたかご存知だったら教えてください。
よろしくお願いしますm(_ _)m
No.2ベストアンサー
- 回答日時:
同じプロセス内の話ならオープンしたファイルハンドルごとで
ファイルハンドルは管理しているので
開きっぱなしでもオープンできる限りはエラーになりません。
ただし、同時にオープンできるファイル数には限界があるので
無尽蔵に開き続けるような場合にはいずれオープンに失敗します
(そういうerrnoがあったはず)
オープンできる限界については
プロセスごとと、OS(カーネルパラメータ)の2段階だった予感
なので、1つのプログラムならば
オープンしたファイルのパス名とハンドルを別管理する等
同じファイルの複数オープンは修正しておいた方がいいと思うけれど
複数のプログラム(実行モジュール)でアクセスしていて
変更できないのなら仕方ないですね。
ただ、
読み取り中に変更されてしまう可能性と変更されると都合悪い場合には
考え直した方がよいですね。
起動元でファイル名にシーケンス番号をつけて渡してあげるとかして
そのファイル名をユニークしてあげるとか
No.3
- 回答日時:
同一のファイルを複数回同時にオープンできるかどうかは処理系定義です。
ですので、処理系を特定せずに憶測で回答しても意味がありません。
処理系のマニュアルを熟読することをお勧めします。
No.1
- 回答日時:
質問者が考えられているように普通の環境では同一ファイルを複数回読み込みオープンしても問題がないと思います。
OSまたはファイルシステムによってファイルの同時オープン数の上限が少ない場合、ファイル自体のオープンが出来ないことはありえます。 また、何かの問題でファイルオープン出来ない場合もあるので必ずファイルオープンに失敗した場合の処理は必要となります。リトライするのであれば少し時間をあけてから再オープンするような処理は、OSではなくプログラム側で考慮しなくてはいけません。
複数ファイルを同時オープン出来るかは次のようなソースで簡単に確認ができるので、まずは試された方がいいと思います。
FILE *fp1,*fp2;
if(NULL ==(fp1=fopen("test.txt","r"))) {printf("1st open NG\n");
} else if(NULL ==(fp2=fopen("test.txt","r"))) {printf("2nd open NG\n");}
fcloseall();
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
このQ&Aを見た人はこんなQ&Aも見ています
-
字面がカッコいい英単語
あなたが思う「字面がカッコいい英単語」を教えてください。
-
フォロワー20万人のアカウントであなたのあるあるを披露してみませんか?
あなたが普段思っている「これまだ誰も言ってなかったけど共感されるだろうな」というあるあるを教えてください
-
映画のエンドロール観る派?観ない派?
映画が終わった後、すぐに席を立って帰る方もちらほら見かけます。皆さんはエンドロールの最後まで観ていきますか?
-
海外旅行から帰ってきたら、まず何を食べる?
帰国して1番食べたくなるもの、食べたくなるだろうなと思うもの、皆さんはありますか?
-
天使と悪魔選手権
悪魔がこんなささやきをしていたら、天使のあなたはなんと言って止めますか?
-
fopne で失敗する原因
C言語・C++・C#
-
fgetsなどのときのstdinのバッファを消すには?
C言語・C++・C#
-
C言語---ファイルに出力したデータをすべて消去する方法
C言語・C++・C#
-
-
4
c言語のポインタへの文字列入力についてです。
C言語・C++・C#
-
5
ファイル書込みで一行もしくは部分的に上書きする
PHP
-
6
関数から配列を返すには?
C言語・C++・C#
-
7
C言語での引数の省略方法
C言語・C++・C#
-
8
fcloseで発生するエラーについて。
C言語・C++・C#
-
9
C言語 exitの使い方
C言語・C++・C#
-
10
ファイル出力で改行を入れたい!
C言語・C++・C#
-
11
ファイルの途中に文字列を挿入
C言語・C++・C#
-
12
構造体のメンバをfor文で回したい
C言語・C++・C#
-
13
fopen() がたまにNULLを返す
C言語・C++・C#
-
14
windowsでLinuxで作成したソースをコンパイル
C言語・C++・C#
-
15
スレッドにて同一メモリの書き込み、読み取り
C言語・C++・C#
-
16
0除算して、落ちるプログラムと落ちないプログラム
C言語・C++・C#
-
17
<unistd.h>をVisualStudioでつかえるようにする
C言語・C++・C#
-
18
sys/time.hのインクルードができない
C言語・C++・C#
-
19
freadでデータがない場合の読込値は?
C言語・C++・C#
-
20
fgetsで拾われる改行文字を削除したい
C言語・C++・C#
関連するカテゴリからQ&Aを探す
おすすめ情報
- ・漫画をレンタルでお得に読める!
- ・人生のプチ美学を教えてください!!
- ・10秒目をつむったら…
- ・あなたの習慣について教えてください!!
- ・牛、豚、鶏、どれか一つ食べられなくなるとしたら?
- ・【大喜利】【投稿~9/18】 おとぎ話『桃太郎』の知られざるエピソード
- ・街中で見かけて「グッときた人」の思い出
- ・「一気に最後まで読んだ」本、教えて下さい!
- ・幼稚園時代「何組」でしたか?
- ・激凹みから立ち直る方法
- ・1つだけ過去を変えられるとしたら?
- ・【あるあるbot連動企画】あるあるbotに投稿したけど採用されなかったあるある募集
- ・【あるあるbot連動企画】フォロワー20万人のアカウントであなたのあるあるを披露してみませんか?
- ・映画のエンドロール観る派?観ない派?
- ・海外旅行から帰ってきたら、まず何を食べる?
- ・誕生日にもらった意外なもの
- ・天使と悪魔選手権
- ・ちょっと先の未来クイズ第2問
- ・【大喜利】【投稿~9/7】 ロボットの住む世界で流行ってる罰ゲームとは?
- ・推しミネラルウォーターはありますか?
- ・都道府県穴埋めゲーム
- ・この人頭いいなと思ったエピソード
- ・準・究極の選択
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
C言語初心者の質問失礼します。
-
テキストファイルの最終行を削...
-
SGファイルって何ですか?
-
VBAにてEXCEL以外のファイル(テ...
-
アプリケーション終了時例外エ...
-
ドラッグアンドドロップでファ...
-
csvファイルを開かずに文字を検...
-
C言語のfopenについて教えてく...
-
static な c 関数の unit-test ...
-
fopenできる上限の変更
-
unlinkしたファイルを元に戻す...
-
FileOpen 関数で既にファイル...
-
Excelマクロでの再読込み方法
-
lseekって
-
CSVファイルへの保存の際、デー...
-
分割コンパイルの#defineについて
-
VBに、Cのincludeのようなもの...
-
グローバル変数のよくない使い...
-
UnicodeでないファイルをUnicod...
-
UTL_FILEにて既存のExcelに追加...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
C言語初心者の質問失礼します。
-
csvファイルを開かずに文字を検...
-
ファイル名の先頭にアンダース...
-
テキストファイルの最終行を削...
-
CSVファイルへの保存の際、デー...
-
VBに、Cのincludeのようなもの...
-
分割コンパイルの#defineについて
-
SGファイルって何ですか?
-
グローバル変数のよくない使い...
-
Excelマクロでの再読込み方法
-
iniファイルに追記がしたいです。
-
ASP .NETでファイル選択ダイア...
-
ハッシュの計算時間について
-
バッチで118項目のCSVを処理し...
-
FileOpen 関数で既にファイル...
-
Javascript で INI の読み書き
-
fopenできる上限の変更
-
VBAにてEXCEL以外のファイル(テ...
-
マウスポインタの変更
-
C言語のfopenについて教えてく...
おすすめ情報