Copiar fichero a vector strings

Iniciado por ElFontaneroGRNA, 14 Enero 2017, 22:35 PM

0 Miembros y 2 Visitantes están viendo este tema.

ElFontaneroGRNA

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 (cpp) [Seleccionar]
#include <iostream>
#include <string>
#include <vector>
#include <fstream>
#include <cstdlib>
#define MAX 90000
using namespace std;

int main (void)
{
    vector <string> v (MAX);
    ifstream archivo1 ("palabras.txt");
    int i=0;

    if (archivo1.fail()) cout<<"El archivo no se abrio correctamente."<<endl;

    while (getline(archivo1, v()))
    {
    cout<<v.at(i)<<endl;
    i++;

    }

  archivo1.close();

   system ("PAUSE");
   return 0;



}


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.

ivancea96

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

Como detalle, tambien puedes usar [] aquí:
Código (cpp) [Seleccionar]
cout << v[i] << endl;

Pero bueno, a tu gusto.

ElFontaneroGRNA

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 (cpp) [Seleccionar]
//Comenzamos el metodo de la burbuja y declaramos las variables que utilizaremos para dicho metodo
unsigned long int r, j;
string temp ;

  //Comienza el metodo de la burbuja
for (r=0; r<v.size()-1; r++){
   for (j=r+1; j<v.size();j++)
       if (v[r] > v[j])
       {
           temp  = v[r];
           v[r] = v[j];
           v[j] = temp;
           }
}


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 (cpp) [Seleccionar]

    ofstream archivo2 ("Palabras2.txt");

     if (archivo2.fail()) cout<<"El archivo no se abrio correctamente."<<endl;
    for (long int z=0; z<v.size(); z++)
    {
        archivo2<<v[z]<<endl;
    }
    archivo2.close();
   


Muchas gracias.DFF.

ivancea96

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 (cpp) [Seleccionar]
temp  = v[r];
v[r] = v[j];
v[j] = temp;

Por:
Código (cpp) [Seleccionar]
string temp( std::move(v[r]) );
v[r] = std::move(v[j]);
v[j] = std::move(temp);

El constructor de movimiento, generalmente, es tan eficiente o más que el constructor de copia.

ElFontaneroGRNA

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.

ivancea96

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.