Autor
|
Tema: Copiar fichero a vector strings (Leído 4,124 veces)
|
ElFontaneroGRNA
Desconectado
Mensajes: 8
|
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: #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.
|
|
|
En línea
|
|
|
|
ivancea96
Desconectado
Mensajes: 3.412
ASMático
|
Quieres guardar la linea en la posición 'i', así que: while (getline(archivo1, v[i]))
Como detalle, tambien puedes usar [] aquí: cout << v[i] << endl;
Pero bueno, a tu gusto.
|
|
|
En línea
|
|
|
|
ElFontaneroGRNA
Desconectado
Mensajes: 8
|
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: //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: 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.
|
|
|
En línea
|
|
|
|
ivancea96
Desconectado
Mensajes: 3.412
ASMático
|
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: temp = v[r]; v[r] = v[j]; v[j] = temp;
Por: 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.
|
|
|
En línea
|
|
|
|
ElFontaneroGRNA
Desconectado
Mensajes: 8
|
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
Mensajes: 3.412
ASMático
|
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
|
|
|
|
|
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
|
4,449
|
1 Junio 2010, 20:32 pm
por kinos
|
|
|
No consigo pasar fichero .txt a vector tipo int
Java
|
thehiphapper
|
3
|
2,888
|
15 Agosto 2013, 17:19 pm
por 1mpuls0
|
|
|
Ayuda con C++ y ordenar vector de strings
Programación C/C++
|
rodrial12
|
1
|
6,088
|
15 Septiembre 2014, 08:35 am
por eferion
|
|
|
De fichero a Vector
Programación C/C++
|
chihue
|
2
|
2,545
|
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
|
1,567
|
21 Junio 2015, 16:34 pm
por TheShocker
|
|