質問をすることでしか得られない、回答やアドバイスがある。

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

新規登録して質問してみよう
ただいま回答率
85.35%
C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

Q&A

解決済

3回答

2779閲覧

テキストファイルをすべて読み出す場合、read関数は1回で読み出せるのか?

OlivePopeye.net

総合スコア26

C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

0グッド

0クリップ

投稿2020/05/28 00:23

いつも活用させていただいております。

早速ですが、質問させていただきます。

やりたいこと

指定したテキストファイルを読み出し、読み出したテキストデータを変数へ格納したい。

知りたいこと

read関数を使用して読み出しをしているが、1回のReadですべてのデータを読み出せないケースはあるのか?
ネットで調べると、read関数を実行し、その返り値(読み出したデータサイズ)が取得サイズと一致
していない場合にwhile等で繰り返すものも見かけるが、そもそも、サイズを指定して読み出して
途中までしか読めないケースがどういう場合なのかがイメージできない

ソースコード

自分がよく使用しているコード抜粋(read関数は1回のみ)
※読み出すファイルサイズは最大でも2MB程度

C

1 struct _stat st; 2 int hf = open(pFileName, O_RDONLY); 3 if (hf < 0 || _fstat(hf, &st) == -1) { 4 return FALSE; 5 } 6 DWORD dwSize = st.st_size; 7 8 char *m_pFile = (char*)malloc(dwSize+1); 9 if (!m_pFile) { 10 close(hf); 11 return FALSE; 12 } 13 14 DWORD dwLen = dwSize; 15 16 int nRead = read(hf, (LPVOID)m_pFile, dwLen); // ★ここのreadでファイル全体を読み出し 17 if (nRead < 0) { 18 close(hf); 19 return FALSE; 20 } 21 22 m_pFile[dwSize] = '\0' 23 24 close(hf);

実行環境

OS:Linux


普段read関数を、1回のみで使用していることがあり、そもそもこのやり方が良くないのか
疑問に思いまして。。。
read関数で、指定したサイズ分読めないケースがどういうものがあるのか教えていただければと思います。
協力宜しくおねがいします。

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

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

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

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

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

guest

回答3

0

サイズを指定して読み出して途中までしか読めないケース

ディスクファイル前提だと、PCやサーバーのLinuxやWindowsでは事実上無いと思います。
端末やパイプやソケットからの読み出しだと普通にあります。

ディスクファイルの場合でも、システム全体のメモリが小さいシステムで、OSカーネルの使えるメモリが少ないときに、ディスクブロックより大きなサイズでreadしてもディスクブロックサイズしか読めないという実装はあり得るかと思います。

投稿2020/05/28 11:02

otn

総合スコア85901

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

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

OlivePopeye.net

2020/06/01 01:19

回答ありがとうございます! なるほど。 利用するOSにも依存する可能性があるというわけですね。 ※今回環境をLinuxと書きましたが、組み込みOSへの実装ということもあり、  PC/Serverではない分、特にMB単位のファイルサイズとなる場合は、ケアが必要かもですね。
guest

0

そのファイルのサイズがすでに分かっている場合、大体のサイズが分かっている場合は、そのサイズより大きいバッファを用意すれば、一度の命令で読み込みはできます。
ましかし、これでは2Gとか4Gとかのサイズのファイルを読む場合、あるいはサイズのわからないやつを読む場合にはちょっと具合が悪いことは分かるでしょう。

たいてい(というかほどんど全部)の場合、決まったサイズのバッファを用意して分割で読み出しするので十分対応できるのでそうしていますね

投稿2020/05/28 00:55

編集2020/05/28 00:56
y_waiwai

総合スコア88042

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

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

OlivePopeye.net

2020/05/28 02:38

1度の命令で読み込みが保証されるという認識で理解しました。 ファイル上限が決まっていて、その分のメモリ確保が可能なのかで判断ということですね。
guest

0

ベストアンサー

ファイルサイズ ≦ 読み込みサイズ
であれば1度に読み込めます。

ファイルサイズ > 読み込みサイズ
の場合、読み込みサイズ分がバッファに読み込まれ、読み込み開始位置が読み込みサイズ分進みます。
再度readを行うと残りが読み込まれますが、残りのファイルサイズ(ファイルサイズ-読み込みサイズ)が
読み込みサイズより大きければ同様の動作となります。

もちろんバッファは最低でも読み込みサイズ分の領域が必要となります。

投稿2020/05/28 00:31

DreamTheater

総合スコア1095

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

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

OlivePopeye.net

2020/05/28 02:37

ファイルサイズ ≦ 読み込みサイズ であれば、1度で読み込めることが保証されるということですね。 ファイルサイズの上限は大枠決まっているので、それが格納可能なバッファ確保が出来ている 前提であれば問題なさそうということで理解しました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問