Ver Mensaje Individual
  #2 (permalink)  
Antiguo 02/05/2007, 14:16
pitukilloloco
 
Fecha de Ingreso: mayo-2006
Mensajes: 40
Antigüedad: 18 años, 7 meses
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.