Hola,
primero, si el original.fail() devuelve true, no significa que haya un problema. Esto significa que alguno de los dos bits de control (failbit or badbit) esta puesto a true.
En nuestro caso, es el failbit que se pone a true cuando, el en bucle anterior, intentas hacer un getline() y que este getline() falla. Para ser preciso, es cuando el getline falla que el failbit y el eofbit se ponen a true (por eso el original.eof() devuelve true despues, y se sale del bucle).
segundo, no solemos trabajar asi con los fstreams.
En ves de lo que haces, oesa el siguiente:
ifstream original;
ofstream nuevo;
string s; //string auxiliar
original.open("original.txt");
bool b = original.good(); // da true
nuevo.open("nuevo.txt");
b = nuevo.good(); // da true
solemos hacer asi:
ifstream original( "original.txt" );
if ( !original ) // ver nota [1]
return error;
ofstream nuevo( "nuevo.txt" );
if ( !nuevo ) // ver nota [2]
return error_critical_hd;
// y ya esta: si llegamos aqui es que todo esta bien
tercero: la segunda parte de tu códido (todo lo que hay despues del bucle), no hace nada y/o no sirve para nada. Salvo el nuevo.good() que efectivamente te dice si todo esta bien con tu nuevo fichero, pero si algo pasa mal en el bucle tal como esta, este programa peta antes de llegar al nuevo.good() ese.
Vamos a ver.
Despues del bucle, haces un original.close(). Vale, esto cierre el aceso al fichero. Pero la variable original (de tipo ifstream) sigue en la pila (stack). Y la posicion de su cursor no ha cambiado. Asi que cuando lo vuelves a abrir, su cursor sigue estando posicionado al final, y ademas con el failbit a true. Si quieres reutilizar la misma variable para seguir manipulando el mismo fichero, tienes que reposicionar el cursor, utilizando la función
seekg().
Espero que ayuda.
Saludos.
notas:
[1] la explicacion de esto es un poco complicado, porque lo que hace el compilador aqui es un cast del ifstream en void* para aplicar el operator void*( ) const; (este operador hace poco más que una llamada a la funcion fail()) de la clase ifstream, pero es la mejor manera de hacer porque entre otros es thread safe.
[2] misma historia. Esta manera de hacer tambien tiene la ventaja que esto falla solo cuando es impossible crear cualquier tipo de fichero, es decir cuando hay un problema gordo con el disco duro.