Foro de elhacker.net

Programación => Programación C/C++ => Mensaje iniciado por: flony en 11 Febrero 2013, 21:58 pm



Título: manejo de archivos txt
Publicado por: flony en 11 Febrero 2013, 21:58 pm
hola amigos bueno a sucedido algo raro mientras trataba de ahcer algo con el manejo de archivos txt.
tengo un txt que tiene nombres de ciudades y finaliza con un 1 deberia darme solo ese trozo desde el nombre hasta el 1
Citar
londres blablablabla 1
paris blablablabla 1
roma blablabla 1
compila de diez, pero ejecuto y me sale un mensaje...
Citar
Unhandled exception at at 0x7634C41F in carta.exe: Microsoft C++ exception: std::out_of_range at memory location 0x0015F4EC.
aca el codigo
Código:
#include <iostream>
#include <fstream>
#include <string>

using namespace std;

string carga_archivo (string nombre)
{
string linea;
ifstream miarchivo;
miarchivo.open(nombre);
if(!miarchivo.good())
{
cout << "Error abriendo archivo";
return "ERROR";
}

while(!miarchivo.eof())
{
getline(miarchivo, linea);
}
miarchivo.close();

return linea;
}

string ubicar_copiar(string leer_texto )
{
string frase, pedazo;
int aux=1;
int posicion1, posicion2;
cout<<"ingrese ciudad " <<endl;
cin >>frase;
posicion1=leer_texto.find(frase);
posicion2=leer_texto.find(aux,posicion1);
pedazo=leer_texto.substr (posicion1,posicion2);
return pedazo;
}

 int main()
 {
string texto, importante;
texto=carga_archivo("ciudad.txt");
importante=ubicar_copiar(texto);
cout<<importante<<endl;
cin.get();
return 0;
 }


Título: Re: manejo de archivos txt
Publicado por: amchacon en 12 Febrero 2013, 15:07 pm
Código
  1. ifstream miarchivo;
  2. miarchivo.open(nombre);
La librería fstream no funciona con strings (de hecho, no se como te ha llegado a compilar).

Tienes que usar la función c_str() para convertir el string a char*
Código
  1. ifstream miarchivo;
  2. miarchivo.open(nombre.c_str());

Por otro lado:

Código
  1. if(!miarchivo.good())
  2. {
  3. cout << "Error abriendo archivo";
  4. return "ERROR";
  5. }
No necesitas comprobar el booleano "good" para ver si se abre el fichero, hay una forma en la que escribes menos:

Código
  1. if(!miarchivo)
  2. {
  3. cout << "Error abriendo archivo";
  4. return "ERROR";
  5. }
Por otro lado, ese código tiene una ambiguedad. Y es que es posible que en algun momento se lea el texto ERROR, lo cual puede llevar a equivocaciones y a problemas.

Una forma de resolverlo sería pasar el string por referencia y devolver verdadero y falso si la función acabo perfectamente:
Código
  1. bool carga_archivo (string nombre,string &linea)
  2. {
  3. ifstream miarchivo;
  4. miarchivo.open(nombre.c_str());
  5. if(!miarchivo.good())
  6. {
  7. cout << "Error abriendo archivo";
  8. return false;
  9. }
  10.  
  11. while(!miarchivo.eof())
  12. {
  13. getline(miarchivo, linea);
  14. }
  15. miarchivo.close();
  16.  
  17. return true;
  18. }


Título: Re: manejo de archivos txt
Publicado por: rir3760 en 12 Febrero 2013, 15:40 pm
Si no tienes un libro o curso de calidad sobre C++ te recomiendo consigas uno, puedes encontrar recomendaciones mediante el motor de búsqueda de los foros.

Ademas de los problemas ya mencionados por amchacon hay otros dos en la logica del programa.
1) Utilizas la función miembro eof para controlar el bucle, usualmente no es una buena idea, en su lugar basta con verificar el estado del stream (el valor de retorno de la función getline).

2) Lees cada linea y las almacenas en la variable linea, ello tiene el efecto de descartar todas menos la ultima pero como el bucle para empezar esta mal (por el uso de eof()) las pierdes todas.

Debes cambiar el bucle y utilizar un vector para almacenar todas las lineas del archivo. Mas o menos así:
Código
  1. vector<string>& leer_lineas(const char *nombre, vector<string>& linea)
  2. {
  3.   ifstream entrada(nombre);
  4.  
  5.   if (entrada.good()){
  6.      for (string temp; getline(entrada, temp); linea.push_back(temp))
  7.         ;
  8.  
  9.      entrada.close();
  10.   }
  11.  
  12.   return linea;
  13. }

Un saludo


Título: Re: manejo de archivos txt
Publicado por: flony en 12 Febrero 2013, 22:40 pm
gracias rir3760 por el consejo en realidad si estoy leyendo uno, que se llama c++ como programar de deitel, en definitiva si cada libro que leo explicara detalladamente cada tema estos foros no tendrían razón de ser, deberás ver que es la aplicación practica a un caso particular de lo aprendido lo que esta mal(o sea yo), y no los conocimientos o no que tenga...si nos lo tuviera no habría echo ni una linea del código , en esencia para aprender a sumar no solo hace falta aprenderlo sino practicarlo...a cuantos no nos dolía la cabeza la regla de los signos en ejercicios combinados :rolleyes: :rolleyes:
pasando a tu aclaración mil gracias la pondré en practica y les aviso.
desde ya agradezco el tiempo puesto para a todos los que leyeron y mas gracias a los que respondieron  ;-) ;-)