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

 

 


Tema destacado: Curso de javascript por TickTack


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


Desconectado Desconectado

Mensajes: 584



Ver Perfil
manejo de archivos txt
« 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;
 }


En línea

si un problema no tiene solucion entonces no es un problema...es algo inevitable
amchacon


Desconectado Desconectado

Mensajes: 1.211



Ver Perfil
Re: manejo de archivos txt
« Respuesta #1 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. }


En línea

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


Desconectado Desconectado

Mensajes: 1.639


Ver Perfil
Re: manejo de archivos txt
« Respuesta #2 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
En línea

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


Desconectado Desconectado

Mensajes: 584



Ver Perfil
Re: manejo de archivos txt
« Respuesta #3 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  ;-) ;-)
En línea

si un problema no tiene solucion entonces no es un problema...es algo inevitable
Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  

Mensajes similares
Asunto Iniciado por Respuestas Vistas Último mensaje
manejo de archivos en C++
Programación C/C++
mauroooooooo 1 3,195 Último mensaje 19 Abril 2012, 03:45 am
por Beakman
[C] Manejo de archivos por dos equipos (No simultaneo) ~ Dropbox
Programación C/C++
Brandford 2 2,148 Último mensaje 1 Septiembre 2013, 09:16 am
por Brandford
Manejo de Archivos
Programación General
danndres 0 1,846 Último mensaje 25 Septiembre 2014, 02:38 am
por danndres
ayuda con manejo de archivos en c
Programación C/C++
tamyta_19 4 2,931 Último mensaje 24 Abril 2015, 17:03 pm
por tamyta_19
Ayuda con Manejo de archivos!
Programación C/C++
pedro0620 1 2,368 Último mensaje 9 Septiembre 2016, 16:02 pm
por AlbertoBSD
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines