Foros del Web » Programación para mayores de 30 ;) » C/C++ »

[SOLUCIONADO] regresar al inicio de un fichero c++

Estas en el tema de regresar al inicio de un fichero c++ en el foro de C/C++ en Foros del Web. Amigos estoy haciendo un ejercicio sencillo pero interesante que me encontre, lo que ise fue leer un archivo para saber cuantas lineas tenia y con ...
  #1 (permalink)  
Antiguo 10/12/2013, 15:40
 
Fecha de Ingreso: junio-2012
Mensajes: 32
Antigüedad: 11 años, 10 meses
Puntos: 1
Pregunta regresar al inicio de un fichero c++

Amigos estoy haciendo un ejercicio sencillo pero interesante que me encontre, lo que ise fue leer un archivo para saber cuantas lineas tenia y con ese tamaño crear un arreglo,bueno si lo lee, y mi archivo de texto por ejemplo es de 3 lineas entonces haora creo mi arreglo de tamaño 3 y procedo a volver a leerlo para guardar cada valor en el arreglo pero no me lee la primera linea

ya use rewind(archvio); de stdio.h pero igual nada

lo que quiero es regresar al inicio de mi archivo porque no me lee la primera linea

este es mi codigo

#include <iostream>
#include <windows.h>
#include <fstream>


using namespace std;






int main(){

fstream archivo;
string linea;

int cantidadLineasTxt=0;

archivo.open("SumaDificil.txt");

if(archivo.fail())
cout<<"Error al abrir el archivo"<<endl;

else{

while(getline(archivo,linea) && archivo.eof() )
cantidadLineasTxt++;



string lineas[cantidadLineasTxt];

cantidadLineasTxt=0;
while(getline(archivo,linea) ){
lineas[cantidadLineasTxt]=linea;
cantidadLineasTxt++;

}

for(int i=0;i<cantidadLineasTxt;i++)
cout<<lineas[i]<<endl;

}
system("pause");
return 0;
}




este es lo que contiene SumaDificil.txt

123456789012 1
2 3
4 5 -1
  #2 (permalink)  
Antiguo 10/12/2013, 17:29
 
Fecha de Ingreso: agosto-2012
Mensajes: 601
Antigüedad: 11 años, 8 meses
Puntos: 83
Respuesta: regresar al inicio de un fichero c++

Creo que rewind solo sirve para tipos FILE*, y tu estas trabajando con un tipo fstream. Prueba con seekg, echa un vistazo a tu manual de c++ para ver que argumentos soporta esta funcion pero puede que con seekg(0) te salte al inicio.

Saludos
vosk
  #3 (permalink)  
Antiguo 10/12/2013, 18:56
 
Fecha de Ingreso: junio-2012
Mensajes: 32
Antigüedad: 11 años, 10 meses
Puntos: 1
Respuesta: regresar al inicio de un fichero c++

Cita:
Iniciado por vosk Ver Mensaje
Creo que rewind solo sirve para tipos FILE*, y tu estas trabajando con un tipo fstream. Prueba con seekg, echa un vistazo a tu manual de c++ para ver que argumentos soporta esta funcion pero puede que con seekg(0) te salte al inicio.

Saludos
vosk
Muchas gracias por contestar intente con lo que mencionas pero igual sigue sin leerme la primera linea,gracias
  #4 (permalink)  
Antiguo 11/12/2013, 05:43
 
Fecha de Ingreso: agosto-2012
Mensajes: 601
Antigüedad: 11 años, 8 meses
Puntos: 83
Respuesta: regresar al inicio de un fichero c++

"...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 original
  1. while(!archivo.eof()) {
  2.     getline(archivo, linea);
  3.     cantidadLineasTxt++;
  4. }

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 original
  1. archivo.clear();
  2. 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 original
  1. ifstream archivo;
  2. vector <string> lineas;
  3. string linea;
  4.  
  5. archivo.open("SumaDificil.txt");
  6.  
  7. if(!archivo.fail()) {
  8.     while(!archivo.eof()) {
  9.         getline(archivo, linea);
  10.         if(linea.length()) {
  11.             lineas.push_back(linea);
  12.         }
  13.     }
  14. }
  15.  
  16. archivo.close();
  17.  
  18. for(int q = 0; q < lineas.size(); q++) {
  19.     cout << q << "-. " << lineas[q] << endl;
  20. }
  21. 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
  #5 (permalink)  
Antiguo 11/12/2013, 15:04
 
Fecha de Ingreso: junio-2012
Mensajes: 32
Antigüedad: 11 años, 10 meses
Puntos: 1
De acuerdo Respuesta: regresar al inicio de un fichero c++

Cita:
Iniciado por vosk Ver Mensaje
"...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 original
  1. while(!archivo.eof()) {
  2.     getline(archivo, linea);
  3.     cantidadLineasTxt++;
  4. }

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 original
  1. archivo.clear();
  2. 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 original
  1. ifstream archivo;
  2. vector <string> lineas;
  3. string linea;
  4.  
  5. archivo.open("SumaDificil.txt");
  6.  
  7. if(!archivo.fail()) {
  8.     while(!archivo.eof()) {
  9.         getline(archivo, linea);
  10.         if(linea.length()) {
  11.             lineas.push_back(linea);
  12.         }
  13.     }
  14. }
  15.  
  16. archivo.close();
  17.  
  18. for(int q = 0; q < lineas.size(); q++) {
  19.     cout << q << "-. " << lineas[q] << endl;
  20. }
  21. 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


Muy interesante todo amigo,cierto todo lo que mencionas en tu codigo ,aprendi varias cosas de verdad muchas gracias

Etiquetas: c++, ficheros, fstream
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 14:45.