Foro de elhacker.net

Programación => Programación C/C++ => Mensaje iniciado por: DeIMachine en 11 Enero 2016, 14:49 pm



Título: [C++]¿Cómo leo y almaceno una matriz de texto de un fichero en una tabla?
Publicado por: DeIMachine en 11 Enero 2016, 14:49 pm
Código
  1. #include <iostream>
  2. #include <fstream>
  3.  
  4. using namespace std;
  5.  
  6. const int MAX_LONG_LINEA=80;
  7. const int MAX_LINEAS=3;
  8.  
  9. struct Subtitulo{
  10.    char texto[MAX_LINEAS][MAX_LONG_LINEA];
  11. };
  12. //Creo la matriz de texto 3x80
  13. Subtitulo definir(char texto[][MAX_LONG_LINEA]){
  14.    Subtitulo S;
  15.     for(int filas=0;filas<MAX_LINEAS;filas++){
  16.        for(int columnas=0;columnas<MAX_LONG_LINEA;columnas++){
  17.            S.texto[filas][columnas]=texto[filas][columnas];
  18.        }
  19.    }
  20.    return S;
  21. }
  22. //Funcion que leera los parrafos de texto maximo de 3 lineas y 80 caracteres por línea:
  23. void leerSubtitulo(char NombreFichero[], Subtitulo S[]){
  24.    ifstream f;
  25.    f.open(NombreFichero);
  26.    char linea[MAX_LONG_LINEA];
  27.    for(int i=0;i<MAX_LINEAS;i++){
  28.        int k=0;
  29.        while(k<MAX_LINEAS && linea[0]!='\0'){
  30.                getline(linea,MAX_LONG_LINEA);
  31.                k++;
  32.        }
  33.    }
  34. }
  35.  
Mi duda está ahí: Cómo puedo guardar cada párrafo de texto max 3x80 en la tabla S[], la separación entre cada párrafo(súbtitulo) es de una línea en blanco de ahí que haya creado esa condición en el while, no sé como podía juntar las líneas, saludos.


Título: Re: [C++]¿Cómo leo y almaceno una matriz de texto de un fichero en una tabla?
Publicado por: ivancea96 en 11 Enero 2016, 15:58 pm
Coloca un ejemplo de fichero.


Título: Re: [C++]¿Cómo leo y almaceno una matriz de texto de un fichero en una tabla?
Publicado por: DeIMachine en 11 Enero 2016, 17:21 pm
Los primeros números son el numero de subtitulo, y luego ya vendría la matriz de texto en la que saldrían los tiempos en los que aparecen y finalmente lo que se dice en ellos. Este sería un ejemplo del fichero:
1
00:02:24,000 --> 00:02:25,600
Rosebud.

2
00:03:02,000 --> 00:03:04,080
News on the March.

3
00:03:23,000 --> 00:03:24,960
Legendary was the Xanadu...

4
00:03:25,000 --> 00:03:28,180
...where Kubla Khan decreed
his stately pleasure dome.





Título: Re: [C++]¿Cómo leo y almaceno una matriz de texto de un fichero en una tabla?
Publicado por: MAFUS en 11 Enero 2016, 18:07 pm
No se C++, pero por lo que acabo de leer getline espera de primer argumento el objeto archivo, en tu caso f, y de segundo argumento la variable que va a contener la cadena.

Después,  por como está configurado el archivo de subtítulos deberás guardar en la variable subtítulo o descartar tanto el número de subtítulo, que podrías usar para hacer un array con todos los subtítulos del archivo, y los tiempos de visualización, que los necesitarás para mostrar en pantalla. Una vez conseguidos o descartados estos dos datos es cuándo vienen las tres líneas que deseas guardar.

Ahora ya podemos ver que tu función leerSubtitulo no puede funcionar, tal y como está construida.
Veo que te han dado el prototipo de la función
Código
  1. void leerSubtitulo(char NombreFichero[], Subtitulo S[])
Subtitulo S[] te indica que recibes un array de subtítulos y debes rellenarlo en la función. ¿Cómo?
Utiliza el índice de subtítulo proporcionado por el archivo, conviértelo en número y réstale 1. Este será tu índice para guardar el dato en el array.
Después viene tu base de tiempos. Si no la vas a utilizar la lees pero no la guardas en ningún sitio, así el contador del fichero se moverá hasta la primera línea de texto.
Ahora lees las líneas de texto, hasta tres o hasta que obtengas una línea vacía. Para cada línea, menos la vacía, vas guardando en cada línea de tu variable de Subtítulo la línea leía.
Si y solo si has leído del fichero tres líneas con texto debes seguir leyendo y, esta vez, descartando líneas de texto del archivo hasta que encuentres una línea vacía.
Repite hasta llegar al final del fichero.

No se C++ y ahora no me pondré a mirar la biblioteca estándar del lenguaje, así que dejo la codificación para ti. Ya nos dirás como te ha ido.


Título: Re: [C++]¿Cómo leo y almaceno una matriz de texto de un fichero en una tabla?
Publicado por: DeIMachine en 14 Enero 2016, 13:41 pm
Perdón por reabrir el tema pero ya tendría mi función lista y no sé porque cuando pido que escriba la matriz de texto me devuelve una dirección a la memoria https://gyazo.com/9743f41d62e11d0e30e0a14db705abf5 (https://gyazo.com/9743f41d62e11d0e30e0a14db705abf5):
Código
  1. void leerSubtitulos(const char NombreFichero[],Subtitulo S[]){
  2.    ifstream f;
  3.    f.open(NombreFichero);
  4.    if(f.is_open()){
  5.        for(int i=0;i<contarSubtitulos(NombreFichero);i++){
  6.            int horas,minutos,seg,mil_seg,numSub;
  7.            char car;
  8.            Tiempo inicial, final;
  9.            char linea[MAX_LONG_LINEA];
  10.            char texto[MAX_LINEAS][MAX_LONG_LINEA];
  11.            int nLineas=0;
  12.            f >> numSub;
  13.            f >> horas >> car >> minutos >> car >> seg >> car >> mil_seg;
  14.            inicial=definir(3600*horas+60*minutos+seg,mil_seg);
  15.            f >> car >> car >> car >> horas >> car >> minutos >> car >> seg >> car >> mil_seg;
  16.            final=definir(3600*horas+60*minutos+seg,mil_seg);
  17.            f.get();
  18.            f.getline(texto[nLineas],MAX_LONG_LINEA);
  19.            while(linea[0]!='\0'){
  20.                nLineas++;
  21.                f.getline(texto[nLineas],MAX_LONG_LINEA);
  22.            }
  23.            S[i]=definir(numSub,nLineas,texto,inicial,final);
  24.        }
  25.    }
  26.    else{
  27.        cerr << "No se ha podido abrir el archivo." << endl;
  28.    }
  29. }
  30.  
  31. int main(){
  32.    Subtitulo T[contarSubtitulos("Fichero.txt")];
  33.    leerSubtitulos01("Fichero.txt",T);
  34.    cout << T[0].texto;
  35. }
  36.  
  37.