Foros del Web » Programación para mayores de 30 ;) » C/C++ »

[SOLUCIONADO] Archivos

Estas en el tema de Archivos en el foro de C/C++ en Foros del Web. Buenas, tengo un problema con este codigo y es que el While no me muestra la cadena. A ver si alguien me puede ayudar...(sin modificar ...
  #1 (permalink)  
Antiguo 29/07/2014, 17:08
 
Fecha de Ingreso: octubre-2011
Mensajes: 17
Antigüedad: 12 años, 6 meses
Puntos: 0
Archivos

Buenas, tengo un problema con este codigo y es que el While no me muestra la cadena. A ver si alguien me puede ayudar...(sin modificar todo el codigo claro :D)

Código C++:
Ver original
  1. #include <iostream>
  2. #include <fstream>
  3. #include <string.h>
  4.  
  5. using namespace std;
  6.  
  7. int main(int argc, char *argv[]) {
  8.     char cadena[80];
  9.    
  10.     cout<<"Introduzca la cadena: ";
  11.     cin>>cadena;
  12.    
  13.     int len = strlen(cadena);
  14.     fstream archivo;                        //Flujo de entrada y salida
  15.     archivo.open("TEXTO", ios::in | ios::out);
  16.    
  17.     for(int i=0; i<len; i++)
  18.         archivo.put(cadena[i]);             //Pone un caracter en archivo
  19.    
  20.     archivo.seekg(0);                       //Va al principio
  21.    
  22.     char ch;
  23.     while(archivo)
  24.     {
  25.         archivo.get(ch);                    //Obtiene un caracter del archivo
  26.         cout<<ch;                           //Lo muestra en la pantalla
  27.     }
  28.     return 0;
  29. }
  #2 (permalink)  
Antiguo 01/08/2014, 00:03
 
Fecha de Ingreso: abril-2008
Ubicación: Santa Fe, Argentina
Mensajes: 41
Antigüedad: 16 años
Puntos: 14
Respuesta: Archivos

No podés usar std::ios::in en un archivo que no existe.

Podés usar app, que crea el archivo o escribe al final si existe:

Código C++:
Ver original
  1. archivo.open("TEXTO", ios::in | ios::out | ios::app);

O trunc, crea el archivo o borra su contenido si existe:

Código C++:
Ver original
  1. archivo.open("TEXTO", ios::in | ios::out | ios::trunc);
  #3 (permalink)  
Antiguo 01/08/2014, 08:22
 
Fecha de Ingreso: octubre-2011
Mensajes: 17
Antigüedad: 12 años, 6 meses
Puntos: 0
Respuesta: Archivos

Hola, antes que nada gracias por tu respuesta que me soluciono esa duda que tenia salvo una cosita, cuando escribo una cadena me imprime la cadena con el ultimo caracter repetido. Por ej, si escribo "Casa" lo que me imprime es "Casaa", que puede ser?
Yo lo solucione agregandole una condicion a While de esta forma:

Código C++:
Ver original
  1. char ch;
  2.     int cont = 0;
  3.     while(archivo && cont != len)
  4.     {
  5.         archivo.get(ch);                    //Obtiene un caracter del archivo
  6.         cout<<ch;                           //Lo muestra en la pantalla
  7.         cont++;
  8.     }

pero no se si esta bien evitar el error de esa forma jaja, me gustaria saber porque me agregaba ese caracter de mas
  #4 (permalink)  
Antiguo 01/08/2014, 11:03
 
Fecha de Ingreso: abril-2008
Ubicación: Santa Fe, Argentina
Mensajes: 41
Antigüedad: 16 años
Puntos: 14
Respuesta: Archivos

Porque usar while(fstream) no es correcto. Lo que hace es comprobar si el descriptor está en un estado válido, y el fin de archivo lo es.

En la última iteración, while(archivo) evalua a true, pero archivo.get(ch) no es válido, entonces se imprime dos veces el mismo ch.

Mejor sería poner el get() en el while, como while(archivo.get(ch)), que casi seguro funciona.
  #5 (permalink)  
Antiguo 01/08/2014, 11:20
 
Fecha de Ingreso: octubre-2011
Mensajes: 17
Antigüedad: 12 años, 6 meses
Puntos: 0
Respuesta: Archivos

Cita:
Iniciado por Henkka Ver Mensaje
Porque usar while(fstream) no es correcto. Lo que hace es comprobar si el descriptor está en un estado válido, y el fin de archivo lo es.

En la última iteración, while(archivo) evalua a true, pero archivo.get(ch) no es válido, entonces se imprime dos veces el mismo ch.

Mejor sería poner el get() en el while, como while(archivo.get(ch)), que casi seguro funciona.
Muchas gracias, me funciono como dijiste. Eso quiere decir que la solucion que le busque yo con el contador y agregarle esa condicion no esta bien hacerlo?
  #6 (permalink)  
Antiguo 02/08/2014, 11:10
 
Fecha de Ingreso: abril-2011
Ubicación: Motril
Mensajes: 49
Antigüedad: 13 años
Puntos: 1
Respuesta: Archivos

Podrás usar el contador que has usado, aunque yo pondria la condicion cont < len por lo que pueda pasar.
Tambien puedes comprobar ch!='EOF', y alguna cosa mas.
Otra es while(archivo.get(ch)!='EOF'), porque el caracter 'EOF' no querras imprimirlo. El contador funciona, pero tienes que mirar el tamaño del archivo. En este caso funcionará, pero si por lo que sea, ademas de leer, tambien escribes en el fichero, tienes que revisar el tamaño del fichero por si ha cambiado. Ten esto en cuenta o usa la forma de Henkka que funciona bien.
__________________
www.anrodse.tk
  #7 (permalink)  
Antiguo 03/08/2014, 00:23
 
Fecha de Ingreso: octubre-2011
Mensajes: 17
Antigüedad: 12 años, 6 meses
Puntos: 0
Respuesta: Archivos

Cita:
Iniciado por anrodse Ver Mensaje
Podrás usar el contador que has usado, aunque yo pondria la condicion cont < len por lo que pueda pasar.
Tambien puedes comprobar ch!='EOF', y alguna cosa mas.
Otra es while(archivo.get(ch)!='EOF'), porque el caracter 'EOF' no querras imprimirlo. El contador funciona, pero tienes que mirar el tamaño del archivo. En este caso funcionará, pero si por lo que sea, ademas de leer, tambien escribes en el fichero, tienes que revisar el tamaño del fichero por si ha cambiado. Ten esto en cuenta o usa la forma de Henkka que funciona bien.
Okey, gracias por responder. Un abrazo!

Etiquetas: int, string
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 23:37.