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

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

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

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

Q&A

解決済

1回答

1208閲覧

io fileの問題

reotantan

総合スコア295

C++

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

0グッド

0クリップ

投稿2015/11/21 16:35

ネットで見つけたコードなのですが、このコードの意図は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; }

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

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

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

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

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

guest

回答1

0

ベストアンサー

推測ですが、ネットのサンプルで使われた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を作って見てください。

C++

1 const char data[]="123456 89"; 2 ofstream ofs("example.bin"); 3 if (ofs.fail()) { 4 cerr << "失敗" << endl; 5 return -1; 6 } 7 ofs.write(data, sizeof(data)); 8 ofs.close();

こちらはネットのサンプルと同じく、9, 10になります。
"123456 89"と書いた場合、文字列はNULL終端されるので"123456 89"の後ろに\0が付いて、全部で10バイトになります。これを"123456 89\0"と表現したのですが不適切な表現でした。
上記と同じdataを下記でも作れます。

C++

1 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[]を下記のように修正して実行すれば作れます。

C++

1 const char data[]={'1', '2', '3', '4', '5', '6', ' ', '8', '9', '\n'};

投稿2015/11/21 17:03

編集2015/11/22 01:35
Chironian

総合スコア23272

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

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

reotantan

2015/11/21 19:04

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

2015/11/22 01:35

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

2015/11/22 12:04

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問