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

EOF() no funciona

Estas en el tema de EOF() no funciona en el foro de C/C++ en Foros del Web. Buenas a todos! Mi pregunta/problema es el siguiente: Tengo un archivo CSV con el siguiente formato: <double>,<double>,<double>,...,<double> <double>,<double>,<double>,...,<double> ... <double>,<double>,<double>,...,<double> Es decir, los números estan ...
  #1 (permalink)  
Antiguo 30/01/2010, 04:24
Avatar de genuine_carlosV2  
Fecha de Ingreso: noviembre-2008
Ubicación: 127.0.0.1
Mensajes: 296
Antigüedad: 15 años, 6 meses
Puntos: 6
EOF() no funciona

Buenas a todos!

Mi pregunta/problema es el siguiente:
Tengo un archivo CSV con el siguiente formato:
<double>,<double>,<double>,...,<double>
<double>,<double>,<double>,...,<double>
...
<double>,<double>,<double>,...,<double>

Es decir, los números estan separados por comas (,). Al finalizar una hilera de números (un registro), hay un salto de linea.
A priori no se ni cuantos registros hay (hileras) ni cuantos campos tiene cada registro (columnas).

Para leer y cargar este archivo, he echo el siguiente algoritmo (tanto en C como en C++):
Código:
void loadDataSet() {
	ifstream dataSetFile;
	dataSetFile.open( "test.csv", ios::in );
	char c;
	double value;

	while( !dataSetFile.eof() ) {
		Register r;
		do {
			dataSetFile >> value;
			dataSetFile >> c;
			cout << "Dato: " << value << endl;
			r.value.push_back( value );
		} while( c == ',' );
	}
}
Como comenté, también lo probé con C (mediante 'fscanf' pero el resultado fué el mismo).

El resultado de este algoritmo es que me lee todos los números pero:
1) La precisión decimal que lee es de 6 cifras decimales cuando los números son en realidad de 12 cifras decimales
2) Lee todos los números hasta el final pero cuando llega al final del archivo, continua leyendo indefinidamente y capturando como 'value' el último número del archivo

Alguna idea de como hacer para coger todos los decimales? Y como puedo hacer para que el EOF() funcione como dios manda?

A ser posible, podrían explicarme porque el EOF() no me funciona?

Muchas gracias por su tiempo

Carlos
  #2 (permalink)  
Antiguo 31/01/2010, 08:49
Avatar de genuine_carlosV2  
Fecha de Ingreso: noviembre-2008
Ubicación: 127.0.0.1
Mensajes: 296
Antigüedad: 15 años, 6 meses
Puntos: 6
Respuesta: EOF() no funciona

Me autorespondo por si a alguien le interesa un algoritmo de lectura de archivos CSV:
Código C++:
Ver original
  1. void loadDataSet() {
  2.     double value;
  3.     char c;
  4.  
  5.     while( !dataSetFile.eof() ) {
  6.         Register r;
  7.         r.cluster = -1;
  8.         do {
  9.             dataSetFile >> value;
  10.             dataSetFile >> c;
  11.             r.value.push_back( value );
  12.         } while( ( c == ',' ) && ( dataSetFile.good() ) );
  13.         dataSet.push_back( r );
  14.     }
  15. }

La clave era 'dataSetFile.good()'. Sin esto, puesto que el último registro no tiene ningún carácter, en la última posición, no leía nada ni asignaba nada a la variable y, por tanto, tenía el antiguo valor y nunca ejecutaba el EOF()

También mencionar que resulta que si que coge el número con la precisión decimal correcta pero no lo mostraba por pantalla
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

SíEste tema le ha gustado a 1 personas




La zona horaria es GMT -6. Ahora son las 00:20.