Обычно это происходит из-за неправильного тестирования конца файла. Обычно вы хотите сделать что-то вроде:
while (infile>>variable) ...
или
while (std::getline(infile, whatever)) ...
но НЕ:
while (infile.good()) ...
или
while (!infile.eof()) ...
Редактировать: первые два выполняют чтение, проверяют, не было ли сбоя, и, если это так, выходят из цикла. Последние два пытаются прочитать, обработать то, что было «прочитано», а затем выйти из цикла на следующей итерации , если предыдущая попытка не удалась.
Edit2: чтобы легко скопировать один файл в другой, рассмотрите возможность использования чего-то вроде этого:
// open the files:
ifstream readfile(inputFile);
ofstream writefile(outputFile);
// do the copy:
writefile << readfile.rdbuf();