回答編集履歴

1

追記

2015/11/22 01:35

投稿

Chironian
Chironian

スコア23272

test CHANGED
@@ -11,3 +11,65 @@
11
11
  でも、ネットは9文字の次が0なのでstrlenは9となり、reotantanさんのは最後の\nもカウントするのでstrlenは10になるのだろうと推測します。
12
12
 
13
13
  なお、str[size] = '\0';しているため、不正アクセスにはなりません。
14
+
15
+
16
+
17
+ ---
18
+
19
+
20
+
21
+ 【追記】
22
+
23
+ 回答の表現が良くなかったので、追記します。
24
+
25
+ ifstreamでファイルをオープンする前に、例えば以下のコードでexample.binを作って見てください。
26
+
27
+ ```C++
28
+
29
+ const char data[]="123456 89";
30
+
31
+ ofstream ofs("example.bin");
32
+
33
+ if (ofs.fail()) {
34
+
35
+ cerr << "失敗" << endl;
36
+
37
+ return -1;
38
+
39
+ }
40
+
41
+ ofs.write(data, sizeof(data));
42
+
43
+ ofs.close();
44
+
45
+ ```
46
+
47
+ こちらはネットのサンプルと同じく、9, 10になります。
48
+
49
+ "123456 89"と書いた場合、文字列はNULL終端されるので"123456 89"の後ろに\0が付いて、全部で10バイトになります。これを"123456 89\0"と表現したのですが不適切な表現でした。
50
+
51
+ 上記と同じdataを下記でも作れます。
52
+
53
+ ```C++
54
+
55
+ const char data[]={'1', '2', '3', '4', '5', '6', ' ', '8', '9', '\0'};
56
+
57
+ ```
58
+
59
+
60
+
61
+ reotantanさんは、example.binをC++言語のプログラムではなく、テキスト・エディタで作ったのではないでしょうか?
62
+
63
+ その時、123456 89の最後で「改行」していると推測しています。その「改行」により\nが入っています。
64
+
65
+ テキスト・エディタは一般にNULL終端しませんので\0は入りません。
66
+
67
+ もし、C++言語でreotantanさんが作ったものと同じexample.binを作る場合、上記のdata[]を下記のように修正して実行すれば作れます。
68
+
69
+ ```C++
70
+
71
+ const char data[]={'1', '2', '3', '4', '5', '6', ' ', '8', '9', '\n'};
72
+
73
+ ```
74
+
75
+