[過去ログ] 【初心者歓迎】C/C++室 Ver.102【環境依存OK】 (1002レス)
上下前次1-新
抽出解除 必死チェッカー(本家) (べ) 自ID レス栞 あぼーん
このスレッドは過去ログ倉庫に格納されています。
次スレ検索 歴削→次スレ 栞削→次スレ 過去ログメニュー
716(1): デフォルトの名無しさん [] 2018/05/05(土) 10:57:39 ID:dx2uIifv(1/6) AAS
file.read((char*)buf, sizeof buf);
は buf のサイズ分だけ読み込めということだと思います。
ファイルの最後の部分を読み込むとき、サイズが WIDTH 未満の場合にはどうなるのでしょうか?
fstream file;
file.open("hello.txt", ios::in | ios::binary);
do {
unsigned char buf[WIDTH];
file.read((char*)buf, sizeof buf);
for (int i = 0, size = file.gcount(); i < size; ++i) {
printf("%02X ", buf[i]);
}
cout << endl;
} while (!file.eof());
file.close(); ◎
Rock54: Caution(BBR-MD5:1341adc37120578f18dba9451e6c8c3b)
718(1): デフォルトの名無しさん [sage] 2018/05/05(土) 11:22:41 ID:dx2uIifv(2/6) AAS
>>717
ありがとうございました。
あともう一つ質問させてください:
ロベールの本なのですが、
int n = 0x41424344;
file.write((const char*)&n, sizeof n);
というコードがあるページにあります。
その少し後ろのページには、以下のコードがあります。
char buf[BUF_SIZE];
dst.write(buf, src.gcount());
ここで、なぜ
dst.write((const char*)buf, src.gcount());
としていないのでしょうか?
721(1): デフォルトの名無しさん [] 2018/05/05(土) 11:58:03 ID:dx2uIifv(3/6) AAS
すみません。もう一つ質問です。
またロベールの本なんですが、以下のコードが書いてあります。
ファイルから入力中にエラーが起きたときの対処法です。
if(src.fail()) {
ではなく、
if(src.fail() && ! src.eof()) {
と書いてあります。その理由として、
「読み込みの場合はファイルの終端に到達した際も fail メンバ関数が
真となるため、 eof メンバ関数が真になる場合は除外しておきます。」
と書いてあります。
そこで質問です。
ファイルの終端の直前の部分を読み込む最後の読み込みの際に何等かのエラーが起こった場合、
src.fail() == true かつ src.eof() == true となります。
そのため、
src.fail() && ! src.eof() == false となってしまいます。
この場合、読み込みエラーが起こったにもかかわらず、その対処ができないことになりはしないでしょうか?
それともロベールさんのコードはOKなコードなんでしょうか?
722: デフォルトの名無しさん [] 2018/05/05(土) 11:58:46 ID:dx2uIifv(4/6) AAS
fstream src;
…
char buf[BUF_SIZE];
src.read(buf, sizeof buf);
if(src.fail() && ! src.eof()) {
error = true;
break;
}
723: デフォルトの名無しさん [sage] 2018/05/05(土) 12:03:26 ID:dx2uIifv(5/6) AAS
>>720720(1): 片山博文MZ ◆T6xkBnTXz7B0 [sage] 2018/05/05(土) 11:56:29 ID:y1NIMmWz(1/6) AAS
>>718
char *はconst char *に互換だから。constは書き換えないという意味で、constなしはconstありに対して互換性がある。
ありがとうございます。
つまりどちらもエラーにはならないということですね。
ですが、記述が統一していない理由というのは何か考えられるでしょうか?
int n = 0x41424344;
file.write((const char*)&n, sizeof n);
に const がついているのは、 n は int 型だから write に渡すときには絶対に
キャストしなければならない。(char *) でもいいが、どうせなら const もつけて
しまおうということですかね?
一方、
char buf[BUF_SIZE];
dst.write(buf, src.gcount());
の方は、キャストの必要がないからわざわざ (const char*) とキャストすることも
ないかなという感じですかね?
724: デフォルトの名無しさん [sage] 2018/05/05(土) 12:05:14 ID:dx2uIifv(6/6) AAS
ロベールさんの本は色々細かいことが書いてあって有用なのですが、なぜこういうコードなんだろう?という
疑問を持って読んでいくと次から次へと疑問が生まれてきて読み進むのが大変です。
上下前次1-新書関写板覧索設栞歴
スレ情報 赤レス抽出 画像レス抽出 歴の未読スレ AAサムネイル
ぬこの手 ぬこTOP 0.031s