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

Problema Con Ficheros Y Streams

Estas en el tema de Problema Con Ficheros Y Streams en el foro de C/C++ en Foros del Web. Hola chicos tengo el siguiente codigo: infile.open("data.txt"); // create input stream and connect "data" to it if(!infile) { cerr << "Unable to open file textfile.doc\n"; ...
  #1 (permalink)  
Antiguo 02/05/2007, 07:19
 
Fecha de Ingreso: abril-2007
Mensajes: 6
Antigüedad: 17 años
Puntos: 0
Problema Con Ficheros Y Streams

Hola chicos tengo el siguiente codigo:

infile.open("data.txt"); // create input stream and connect "data" to it
if(!infile)
{
cerr << "Unable to open file textfile.doc\n";
sc_stop();
}
else
{
cout << infile.tellg();
cout <<"\n";

// Read first line to know the length
infile.getline(line,N);
a1->columns=strlen(line);
cout << a1->columns;
cout << "\n";

// Count the number of lines
do
{
a1->rows++;
infile.getline(line,N);
}while(infile);
//infile.close();
cout << a1->rows;
cout << "\n";

// Create the matrix
a1->constructor();
cout << "EXIT CONSTRUCTOR\n";

infile.seekg(ios::end);
j=infile.tellg();
cout << j;
cout << "\n";
// in.open("data.txt");
while((infile)&&(i<a1->rows))
{
// Read next line
infile.getline(line,N);
// Copy the read information into an array
a1->array[i]=line;
// Print the read information
cout << a1->array[i]<< endl;
// Increase the index
i++;
}
cout << i;
cout << "\n";
// infile.seekg(ios::end);
infile.close();
cout << "File closed\n";
a1->destructor();
cout << "Memory deleted\n";


Si utilizo el mismo stream para leer y copiar el fichero la funcion "tellg" me dice que el stream esta en -1 y por lo tanto no copia nada, pero si utilizo streams diferentes despues de cerrar el stream me dice que hay un problema de direccionamiento (mas exactamente: free(): invalid pointer: 0x0807e71c ***)
POR FAVOR NECESITO AYUDA, ME ESTOY VOLVIENDO LOCA!!!!!!!!!

Gracias
  #2 (permalink)  
Antiguo 02/05/2007, 14:16
 
Fecha de Ingreso: mayo-2006
Mensajes: 40
Antigüedad: 18 años
Puntos: 0
Re: Problema Con Ficheros Y Streams

Como yo comenzé programando en lenguaje C, para la entrada y salida estándar prefiero usar las de la librería stdio. Hay muchos consejos, al final de cada capítulo, en la tercera edición del libro El Lenguaje de Programación C++ del creador del lenguaje C++ Bjarne Stroustrup, sobre evitar varias prácticas comunes que se tiene al programar en C. Por ejemplo, en C es obligatorio declarar todas las variables al abrir una llave que encierra un bloque y el autor aconseja declararlas inmediatamente antes de su uso, ya que C++ no tiene esta restricción, también aconseja usar las string en vez de, por ejemplo, char s[MAX], usar la clase vector en vez de arreglos, etc. Bueno, pues con respecto a usar las funciones de stdio, ni aconseja ni desaconseja su uso, sólo se limita a describirlas brevemente y aconseja usar la instrución sync_with_stdio (false); antes de usarlas, si se van a usar mezcladas con las de los flujos, para que no compartan el mismo buffer.

Bueno, dicho lo anterior, esto es lo que haría para leer las líneas de tu archivo
Código:
    ...
   sync_with_stdio (false); // para no mezclar en el mismo buffer e/s de <stdio> e <iostream>
                            // se debe de llamar a esta funciom antes de usar <stdio> 
    ...
   FILE* fp;
   if ((fp = fopen ("data.txt", "r") == NULL) {
      cerr << "Error al abrir el archivo data.txt" << endl";
      sc_stop();
   } else {
      fgets (line, N, fp); // lee la primera linea
       ...
       for (a1->rows++; fgets (line, N, fp) != NULL, a1->rows++) // cuenta las lineas
          ;
        ...
       fseek (fp, 0L, SEEK_SET); // vuelve apuntar al comienzo del archivo
       while (fgets (line, N, fp) != NULL) { // lee nuevamente las lineas
          ...
       }
       fclose (fp);
   }
    ...
Es sólo una manera de resolver el problema, pero si quieres continuar usando los flujos, adelante, quizá otro lector del foro te proponga otra usando flujos.
Analizando un poco tu código, veo un poco extraño que determines el número de columnas por la longitud de la primer cadena que lees, además, si estás definiendo una clase matriz ¿no sería más lógico que le dieras las dimensiones al crear un objeto matriz pasándoselos a su constructor? En C++ puedes crear uno o varios constructores y un destructor, las cuáles se llaman implícitamente, cuando creas un objeto y cuando éste deja de existir fuera de su ámbito, ¿por qué llamar explícitamente a1->constructor(); y a1->destructor();? Al programar de esa manera desaprovechas las ventajas que te proporciona este lenguaje y por contra, puedes introducir en tu código potenciales fallas si se te olvida llamar al constructor al comenzar a usar al objeto, o al destructor cuando termina la función donde lo estés usando.
  #3 (permalink)  
Antiguo 03/05/2007, 03:05
 
Fecha de Ingreso: abril-2007
Mensajes: 6
Antigüedad: 17 años
Puntos: 0
Re: Problema Con Ficheros Y Streams

Te explico, quiero crear "matrices" a partir de las dimensiones de un fichero, es decir, el ancho del fichero es la longitud de la matriz y el largo del fichero es el largo de la matriz, no sé si me explico bien. Por eso necesito primero leer el fichero para saber las dimensiones, luego crear la matriz y luego copiar el contenido del fichero en dicha matriz. EL motivo de que no pase parametros es que en realidad estoy utilizando SystemC y no el simple c++ y los metodos de cada modulo no pueden pasar parametros.
  #4 (permalink)  
Antiguo 04/05/2007, 07:50
Avatar de _Lucifer_  
Fecha de Ingreso: junio-2006
Mensajes: 1.662
Antigüedad: 17 años, 11 meses
Puntos: 28
Re: Problema Con Ficheros Y Streams

¿Por que no pones una muestra del formato del archivo para ver mas o menos como es? Asi quizas sea un poco mas facil ayudarte.

Cuando dices el ancho del archivo ¿te refieres a la cantidad de caracteres que hay en una linea? ¿o a la cantidad de columnas de datos que estan delimitadas por algun separador?

Saludos
__________________
Si crees que no tiene sentido, etonces probablemente lo tenga... :arriba:
  #5 (permalink)  
Antiguo 07/05/2007, 03:08
 
Fecha de Ingreso: abril-2007
Mensajes: 6
Antigüedad: 17 años
Puntos: 0
Re: Problema Con Ficheros Y Streams

Ya esta solucionado:

infile.open("data.txt"); // create input stream and connect "data" to it
in.open("data.txt");

if(!infile || !in)
{
cerr << "Unable to open file data.txt\n";
sc_stop();
}
else
{
cout << infile.tellg();
cout <<"\n";

// Read first line to know the length
infile.getline(line,N);
a1->columns=strlen(line);
cout << a1->columns;
cout << "\n";

// Count the number of lines
do
{
a1->rows++;
infile.getline(line,N);
}while(infile);

infile.close();
cout << a1->rows;
cout << "\n";

// Create the matrix
a1->constructor();
cout << "EXIT CONSTRUCTOR\n";

while((in)&&(i<a1->rows))
{
// Read next line
in.getline(line,N);
// Copy the read information into an array
a1->array[i]=line;

// Print the read information
cout << a1->array[i] << endl;
// Increase the index
i++;
}

cout << i;
cout << "\n";

in.close();
cout << "File closed\n";

// a1->destructor();

cout << "Memory deleted\n";
matrix_finished.write(1);
data.write(*a1);
}
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 04:35.