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

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

ただいまの
回答率

90.51%

  • C++

    4413questions

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

io fileの問題

解決済

回答 1

投稿

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

reotantan

score 251

ネットで見つけたコードなのですが、このコードの意図はnull文字を後ろにいれてしまい、strlenとsizeが9,10となるとサイトにはあったのですが、僕が実行すると10,10のなってしまいます。
example.bin には123456  89と打ってあるだけです。
ご指摘よろしくお願いします


コード
ifstream ifs("example.bin");
    if (ifs.fail()) {
        cerr << "失敗" << endl;
        return -1;
    }
    int begin = static_cast<int>(ifs.tellg());
    ifs.seekg(0, ifs.end);
    int end = static_cast<int>(ifs.tellg());
    int size = end - begin;
    ifs.clear();    //ここでclearしてEOFフラグを消す
    ifs.seekg(0, ifs.beg);
    char *str = new char[size + 1];
    str[size] = '\0';
    ifs.read(str, size);
    cout << "[" << str << "]" << endl;
    cout << "size: " << size << " strlen:" << strlen(str) << endl;
    delete[] str;
    return 0;
}
  • 気になる質問をクリップする

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

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

    クリップを取り消します

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

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

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

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

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

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

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

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

    質問の評価を下げる

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

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

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

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

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

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

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

    詳細な説明はこちら

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

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

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

回答 1

checkベストアンサー

+1

推測ですが、ネットのサンプルで使われたexample.binの内容は、"123456 89\0"になっていると思います。
そして、reotantanさんのexample.binの内容は、"123456 89\n"になっているのではないでしょうか?
普通にテキスト・エディタで編集すると最後にEnterを押すことが多いので、\nが入っている予感です。

であれば、ネットもreotantanさんのもファイルのサイズとしては両方とも10バイトです。
でも、ネットは9文字の次が0なのでstrlenは9となり、reotantanさんのは最後の\nもカウントするのでstrlenは10になるのだろうと推測します。
なお、str[size] = '\0';しているため、不正アクセスにはなりません。


【追記】
回答の表現が良くなかったので、追記します。
ifstreamでファイルをオープンする前に、例えば以下のコードでexample.binを作って見てください。
    const char data[]="123456 89";
    ofstream ofs("example.bin");
    if (ofs.fail()) {
        cerr << "失敗" << endl;
        return -1;
    }
    ofs.write(data, sizeof(data));
    ofs.close();
こちらはネットのサンプルと同じく、9, 10になります。
"123456 89"と書いた場合、文字列はNULL終端されるので"123456 89"の後ろに\0が付いて、全部で10バイトになります。これを"123456 89\0"と表現したのですが不適切な表現でした。
上記と同じdataを下記でも作れます。
    const char data[]={'1', '2', '3', '4', '5', '6', ' ', '8', '9', '\0'};

reotantanさんは、example.binをC++言語のプログラムではなく、テキスト・エディタで作ったのではないでしょうか?
その時、123456 89の最後で「改行」していると推測しています。その「改行」により\nが入っています。
テキスト・エディタは一般にNULL終端しませんので\0は入りません。
もし、C++言語でreotantanさんが作ったものと同じexample.binを作る場合、上記のdata[]を下記のように修正して実行すれば作れます。
    const char data[]={'1', '2', '3', '4', '5', '6', ' ', '8', '9', '\n'};

投稿

編集

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2015/11/22 04:04

    ファイルには123456 89をいれていました。(”も使っていない)chiro様に言われたとおり
    "123456 89\0"に訂正しましたがsizeもstrlenも13で同じままです。(”の部分が増えた)
    binファイルが原因とかですかね

    キャンセル

  • 2015/11/22 10:35

    すいません。表現が良くなくて誤解させてしまいました。
    回答に追記しています。

    キャンセル

  • 2015/11/22 21:04

    はい、メモに自分で打ち込んでいました。
    なるほど、そういう事でしたか。
    丁寧な解説ありがとうございます、いつもとても助けられています。

    キャンセル

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

  • C++

    4413questions

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