C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

Re[4]: C++のファイル入出力について


(過去ログ 24 を表示中)

[トピック内 6 記事 (1 - 6 表示)]  << 0 >>

■10912 / inTopicNo.1)  C++のファイル入出力について
  
□投稿者/ マエサキ (1回)-(2007/12/01(Sat) 15:38:12)

分類:[C/C++] 

ファイルの入出力の際に、
ifstream fin("入力ファイル名");
ofstream fout("出力ファイル名");
char ch;

while(!fin.eof()){
fin >> ch;
if(!fin.eof()){
fout << ch;
}
}
のように、whileの条件文で一度!fin.eof()を判定しておいて、もう一度出力ファイルに書き出す際に!fin.eof()
を判定するのは何故なのでしょうか?
引用返信 編集キー/
■10913 / inTopicNo.2)  Re[1]: C++のファイル入出力について
□投稿者/ 774RR (70回)-(2007/12/01(Sat) 16:13:02)
C の fread や C++ の istream::operator << 等は 「実際に読もうとしてはじめて EOF かどうかわかる」
という性質を持っているためだ。

ifstream fin(filename); が成功した時点ではまだ EOF かどうかの検査は行われていない
直後に使われる最初の fin.eof() は EOF かどうかを検査していないので常に false となる
fin >> ch のように読み取りを行おうとした時点で EOF かどうかの検査が行われる

が、提示のソースはたぶん無駄ぽ。俺なら以下のように書く。
参考書を読んでるんだとしたら、これが妥当である解説がもうちょっと先に現れると思うぞ
while (fin>>ch) fout << ch;

引用返信 編集キー/
■10914 / inTopicNo.3)  Re[1]: C++のファイル入出力について
□投稿者/ επιστημη (698回)-(2007/12/01(Sat) 16:14:30)
επιστημη さんの Web サイト
> whileの条件文で一度!fin.eof()を判定しておいて、もう一度出力ファイルに書き出す際に!fin.eof()
> を判定するのは何故なのでしょうか?

読んでみないことには "ホントにeof" かわかんないことがあるから?

めんどくせーので僕なら↓こーする。

#include <fstream>
using namespace std;

int main() {
  ifstream fin("foo.cpp");
  ofstream fout("foo.out");
  char ch;
  while( fin >> ch ){
    fout << ch;
  }
}

引用返信 編集キー/
■10915 / inTopicNo.4)  Re[2]: C++のファイル入出力について
□投稿者/ επιστημη (699回)-(2007/12/01(Sat) 16:15:20)
επιστημη さんの Web サイト
ぐはー モロかぶり ^^;

引用返信 編集キー/
■10916 / inTopicNo.5)  Re[3]: C++のファイル入出力について
□投稿者/ マエサキ (2回)-(2007/12/01(Sat) 17:47:57)
ご返信ありがとうございました。
確かにそのような理由であるならば、
while (fin>>ch)
とした方がよいですね。非常に勉強になりました。
引用返信 編集キー/
■10923 / inTopicNo.6)  Re[4]: C++のファイル入出力について
□投稿者/ 774RR (71回)-(2007/12/02(Sun) 08:44:32)
> while (fin>>ch)
がどう解釈されて、どういう原理で、どんなときにループを抜けるのか
理解せずに使うとバグるよ。特に読み込むのが char 以外の場合に。

説明できる?
引用返信 編集キー/


トピック内ページ移動 / << 0 >>

このトピックに書きこむ

過去ログには書き込み不可

管理者用

- Child Tree -