elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.

 

 


Tema destacado: Rompecabezas de Bitcoin, Medio millón USD en premios


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación C/C++ (Moderadores: Eternal Idol, Littlehorse, K-YreX)
| | |-+  Copiar fichero a vector strings
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] Ir Abajo Respuesta Imprimir
Autor Tema: Copiar fichero a vector strings  (Leído 2,700 veces)
ElFontaneroGRNA

Desconectado Desconectado

Mensajes: 8


Ver Perfil
Copiar fichero a vector strings
« en: 14 Enero 2017, 22:35 pm »

Buenas noches a todos,

Estoy intentando hacer un programa que copie un fichero de texto (un diccionario), en un vector de strings. El problema es que no he trabajado apenas ni con vectores ni ficheros, ni si quiera los he visto en clase...

Bueno lo que tenog es lo siguiente:

Código
  1. #include <iostream>
  2. #include <string>
  3. #include <vector>
  4. #include <fstream>
  5. #include <cstdlib>
  6. #define MAX 90000
  7. using namespace std;
  8.  
  9. int main (void)
  10. {
  11.    vector <string> v (MAX);
  12.    ifstream archivo1 ("palabras.txt");
  13.    int i=0;
  14.  
  15.    if (archivo1.fail()) cout<<"El archivo no se abrio correctamente."<<endl;
  16.  
  17.    while (getline(archivo1, v()))
  18.    {
  19.    cout<<v.at(i)<<endl;
  20.    i++;
  21.  
  22.    }
  23.  
  24.  archivo1.close();
  25.  
  26.   system ("PAUSE");
  27.   return 0;
  28.  
  29.  
  30.  
  31. }
  32.  

Al compilar me da el fallo en el getline, pero no sé que es lo que falla ahí.
En el while, aunque no hace falta, que me muestre las palabras que se guarden en cada posición del vector, para ver si funciona principalmente.

Muchas gracias de antemano.


En línea

ivancea96


Desconectado Desconectado

Mensajes: 3.414


ASMático


Ver Perfil WWW
Re: Copiar fichero a vector strings
« Respuesta #1 en: 14 Enero 2017, 22:59 pm »

Quieres guardar la linea en la posición 'i', así que:
Código
  1. while (getline(archivo1, v[i]))

Como detalle, tambien puedes usar [] aquí:
Código
  1. cout << v[i] << endl;

Pero bueno, a tu gusto.


En línea

ElFontaneroGRNA

Desconectado Desconectado

Mensajes: 8


Ver Perfil
Re: Copiar fichero a vector strings
« Respuesta #2 en: 15 Enero 2017, 11:56 am »

Muchas gracias ivancea96, ya si me funciona correctamente.

Ahora estoy intentando ordenar el vector de strings, atendiendo a la longitud de las cadenas de mayor a menor, mediante el metodo de la buruja. El código que tengo es el siguiente:

Código
  1. //Comenzamos el metodo de la burbuja y declaramos las variables que utilizaremos para dicho metodo
  2. unsigned long int r, j;
  3. string temp ;
  4.  
  5.  //Comienza el metodo de la burbuja
  6. for (r=0; r<v.size()-1; r++){
  7.   for (j=r+1; j<v.size();j++)
  8.       if (v[r] > v[j])
  9.       {
  10.           temp  = v[r];
  11.           v[r] = v[j];
  12.           v[j] = temp;
  13.           }
  14. }

El problema es que no sé si está bien, ya que entre otras cosas al ejecutarlo tarda mucho, tanto que lo he tenido que cerrar el programa xD.

¿Hay algo mal o poco eficiente?


También he hecho para que el programa me copie todo lo de un vector de strings en un archivo de texto nuevo, para el que le haga falta:
Código
  1.    ofstream archivo2 ("Palabras2.txt");
  2.  
  3.     if (archivo2.fail()) cout<<"El archivo no se abrio correctamente."<<endl;
  4.    for (long int z=0; z<v.size(); z++)
  5.    {
  6.        archivo2<<v[z]<<endl;
  7.    }
  8.    archivo2.close();
  9.  

Muchas gracias.DFF.
En línea

ivancea96


Desconectado Desconectado

Mensajes: 3.414


ASMático


Ver Perfil WWW
Re: Copiar fichero a vector strings
« Respuesta #3 en: 15 Enero 2017, 19:48 pm »

No sé cual es el tamaño del diccionario. Prueba con un archivo pequeño.

Si no funciona, tendrás que optimizarlo. El método burbuja d epor sí es bastante lento, pero además copiar strings también lo puede ser.

Una opción, es cambiar:
Código
  1. temp  = v[r];
  2. v[r] = v[j];
  3. v[j] = temp;
Por:
Código
  1. string temp( std::move(v[r]) );
  2. v[r] = std::move(v[j]);
  3. v[j] = std::move(temp);
El constructor de movimiento, generalmente, es tan eficiente o más que el constructor de copia.
En línea

ElFontaneroGRNA

Desconectado Desconectado

Mensajes: 8


Ver Perfil
Re: Copiar fichero a vector strings
« Respuesta #4 en: 16 Enero 2017, 00:18 am »

Muchas gracias de nuevo ivancea96,

He intentado poner lo de 'move', pero me da un fallo al compilar, lo he "googleado" y me dice que es por culpa del compilador, que esa version no lo rece del tonoce o algo. Da igual, lo he dejado como estaba.


Por otro lado, he dejado que se ejecute del todo, habrá tardado más de 10min xDD (tendrá cerca de 60000 palabras el diccionario ese o más no estoy seguro).
El problema es que me meto en el fichero nuevo para ver el resultado y lo que ha hecho ha sido dejar muchísimas lineas en blanco al principio, y a la mitad o más del archivo, aparece el diccionario sin ordenar.

Supongo que estará el fallo en el método de la burbuja, pero no lo veo.

Espero vuestras respuestas xD, gracias.
En línea

ivancea96


Desconectado Desconectado

Mensajes: 3.414


ASMático


Ver Perfil WWW
Re: Copiar fichero a vector strings
« Respuesta #5 en: 16 Enero 2017, 08:36 am »

Si tal,a segúrate de que al leer del archivo no lees lineas vacías por lo que sea. Si las lees, no las metas en el vector.

std::move() está en C++11. Si utilizas GCC, puedes compilar con "-std=c++11". No sé cómo compilas, si tienes alguna duda pregunta.

std::move puede aumentar bastante la eficiencia.

Tienes sinó otro modo. Guardar un vector de string*. Al guardar punteros a string, el intercambio de valores será mucho más rápido (copias punteros, que suelen ser 4 bytes, en vez de strings completas). Todo lo demás será prácticamente idéntico.
En línea

Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  

Mensajes similares
Asunto Iniciado por Respuestas Vistas Último mensaje
estructura de datos o fichero para guardar strings, que sea rapida la consulta
Java
kinos 2 3,936 Último mensaje 1 Junio 2010, 20:32 pm
por kinos
No consigo pasar fichero .txt a vector tipo int
Java
thehiphapper 3 2,234 Último mensaje 15 Agosto 2013, 17:19 pm
por 1mpuls0
Ayuda con C++ y ordenar vector de strings
Programación C/C++
rodrial12 1 4,942 Último mensaje 15 Septiembre 2014, 08:35 am
por eferion
De fichero a Vector
Programación C/C++
chihue 2 1,808 Último mensaje 22 Diciembre 2014, 15:57 pm
por Yoel Alejandro
Recorrer un fichero y meterlo en un vector/Matriz/etc
Programación C/C++
TheShocker 0 957 Último mensaje 21 Junio 2015, 16:34 pm
por TheShocker
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines