ファイルのコピーを行うため、下のようなコードを書いたのですが、
どうやらEOFまで書き込んでしまってるようです。

ifstream in;
ofstream out;
in.open("test.txt",ios::in | ios::binary);
out.open("test2.txt",ios::out | ios::binary);
while(!in.eof()){
 out.put(in.get());
}

下のようにすれば、EOFを書きこまずに済みましたが、
なんだか冗長な気がします。

while(!in.eof()){
 int c=in.get();
 if(!in.eof())
  out.put(c);
}

そもそも eof() って、次の get() 等が失敗することを
知るためのものではないのですか? get() 等が失敗した後でしか
eof() は真にならないのでしょうか。