"...sigue sin leerme la primera linea..."
El problema no es que no te lea la primera linea, sino que el ciclo que cuenta las lineas está contando mientras fstream::eof sea cierto, es decir que antes de la primera linea termina el ciclo; lo que tu quieres es leer mientras eof sea falso, revisa tu manual de c++ :
Código C++:
Ver originalwhile(!archivo.eof()) {
getline(archivo, linea);
cantidadLineasTxt++;
}
Luego de esto viene lo del seekg que tenias que haver revisado en tu manual de c++ y habrias visto esto:
Código C++:
Ver originalarchivo.clear();
archivo.seekg(0, archivo.beg);
Y diras: y el clear?? Bueno es algo de cuando el puntero de lectura llega al final del archivo cualquier operacion se cancela, incluidos los desplazamientos; con el clear limpio los flags de estado para que seekg pueda funcionar.
Y luego haces otro bucle para cargar las lineas igual que el primero. Y cuando terminas de usar el puntero al archivo debes cerrarlo con close().
Hasta aquí ok? Ahora otra cosa, planteate ahorrar algo de tiempo y no recorrer dos veces todo el archivo usando algun tipo de lista; te pongo un ejemplo con vector:
Código C++:
Ver originalifstream archivo;
vector <string> lineas;
string linea;
archivo.open("SumaDificil.txt");
if(!archivo.fail()) {
while(!archivo.eof()) {
getline(archivo, linea);
if(linea.length()) {
lineas.push_back(linea);
}
}
}
archivo.close();
for(int q = 0; q < lineas.size(); q++) {
cout << q << "-. " << lineas[q] << endl;
}
lineas.clear();
Con un solo while cargas todas las lineas (implicito el nº de lineas) y cierras el archivo. Cualquier otra operacion la haces sobre el vector.
Una ultima cosa: la cabecera de windows para que la usas? Para el system? Puedes usar cin.get() para hacer lo mismo y quitar windows.h
Saludos
vosk