manejo de archivos txt

Iniciado por flony, 11 Febrero 2013, 21:58 PM

0 Miembros y 1 Visitante están viendo este tema.

flony

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
Citarlondres blablablabla 1
paris blablablabla 1
roma blablabla 1
compila de diez, pero ejecuto y me sale un mensaje...
CitarUnhandled exception at at 0x7634C41F in carta.exe: Microsoft C++ exception: std::out_of_range at memory location 0x0015F4EC.
aca el codigo
#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;
}
si un problema no tiene solucion entonces no es un problema...es algo inevitable

amchacon

Código (cpp) [Seleccionar]
ifstream miarchivo;
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 (cpp) [Seleccionar]
ifstream miarchivo;
miarchivo.open(nombre.c_str());


Por otro lado:

Código (cpp) [Seleccionar]
if(!miarchivo.good())
{
cout << "Error abriendo archivo";
return "ERROR";
}

No necesitas comprobar el booleano "good" para ver si se abre el fichero, hay una forma en la que escribes menos:

Código (cpp) [Seleccionar]
if(!miarchivo)
{
cout << "Error abriendo archivo";
return "ERROR";
}

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 (cpp) [Seleccionar]
bool carga_archivo (string nombre,string &linea)
{
ifstream miarchivo;
miarchivo.open(nombre.c_str());
if(!miarchivo.good())
{
cout << "Error abriendo archivo";
return false;
}

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

return true;
}
Por favor, no me manden MP con dudas. Usen el foro, gracias.

¡Visita mi programa estrella!

Rar File Missing: Esteganografía en un Rar

rir3760

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 (cpp) [Seleccionar]
vector<string>& leer_lineas(const char *nombre, vector<string>& linea)
{
   ifstream entrada(nombre);

   if (entrada.good()){
      for (string temp; getline(entrada, temp); linea.push_back(temp))
         ;

      entrada.close();
   }

   return linea;
}


Un saludo
C retains the basic philosophy that programmers know what they are doing; it only requires that they state their intentions explicitly.
--
Kernighan & Ritchie, The C programming language

flony

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  ;-) ;-)
si un problema no tiene solucion entonces no es un problema...es algo inevitable