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

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

ただいまの
回答率

88.11%

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

解決済

回答 3

投稿

  • 評価
  • クリップ 0
  • VIEW 384

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

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

やりたいこと

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

知りたいこと

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

ソースコード

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

    struct _stat st;
    int hf = open(pFileName, O_RDONLY);
    if (hf < 0 || _fstat(hf, &st) == -1) {
        return FALSE;
    }
    DWORD dwSize = st.st_size;

    char *m_pFile = (char*)malloc(dwSize+1);
    if (!m_pFile) {
        close(hf);
        return FALSE;
    }

    DWORD dwLen = dwSize;

    int nRead = read(hf, (LPVOID)m_pFile, dwLen); // ★ここのreadでファイル全体を読み出し
    if (nRead < 0) {
        close(hf);
        return FALSE;
    }

    m_pFile[dwSize] = '\0'

    close(hf);

実行環境

OS:Linux


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

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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 3

+1

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

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

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2020/05/28 11:38

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

    キャンセル

+1

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

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

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

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2020/06/01 10:19

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

    キャンセル

checkベストアンサー

0

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

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

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

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2020/05/28 11:37

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

    キャンセル

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

  • ただいまの回答率 88.11%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る