Guarda cadenas con espacios - como?

Iniciado por d00ze13, 17 Mayo 2011, 23:25 PM

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

d00ze13

Queria saber si se puede guardar una caddena con espacios en blanco y guardarlo en una variable de una estructura y luego guardarla en un fichero y que te pueda leer la cadena esa con sus espacios al leer el fichero, eso es posible?
pongo un ejemplo para que me entendais, faltaria la escritura y lectura a fichero
Código (cpp) [Seleccionar]

#include <iostream>
using namespace std;

struct datos{
    char texto[100];
};
int main(){
struct datos persona;
    cout<<"Introduce texto"<<endl;
    cin>>persona.texto; // Aqui escribiriamos por ejemplo -> esto es una prueba con espacios

    cout<<persona.texto;
}

naderST

No entiendo la pregunta, no te almacena en persona.texto el texto con espacios?

Queta

#2
Código (cpp) [Seleccionar]
#include <cstdio>

int main()
{
char cadena[100];

fgets(cadena, 100, stdin);

printf("%s", cadena);

getchar();

return 0;
}


El texto se queda guardado en la cadena, que lógicamente puedes escoger el tamaño que te convenga, y simplemente luego abres el fichero y escribes el contenido. Igual no estaría de más que leyeras sobre cadenas y las funciones básicas de input y output:

http://www.cplusplus.com/doc/tutorial/arrays/
http://www.cplusplus.com/doc/tutorial/basic_io/

cin sólo lee hasta el primer espacio.

Advertencia - mientras estabas escribiendo, una nueva respuesta fue publicada. Probablemente desees revisar tu mensaje.
"Intenta no volverte un hombre de éxito, sino volverte un hombre de valor." Albert Einstein.

willyhunting

Por supuesto que puedes leer una cadena con espacios y guardarla en un fichero, el espacio es un carácter como cualquier otro.

Queta

Usando cin de esta manera, solamente puedes hasta el primer espacio en blanco.
"Intenta no volverte un hombre de éxito, sino volverte un hombre de valor." Albert Einstein.

d00ze13


Queta

¿Pero qué método usarás al final?
"Intenta no volverte un hombre de éxito, sino volverte un hombre de valor." Albert Einstein.

d00ze13

pues aun no lo se, voy a probar varias y la que vea que mejor va, probare estas 2 de momento pero ya mañana que madrugo y sino luego no me tengo, ya os contare cual me fue mejor y el codigo por si le es de utilidad a alguien

fgets(cadena, 100, stdin);

string cadena;
getline(cin,cadena);

d00ze13

Buena ya estoy con el codigo que mas o menos lo tengo salvo que cuando hace la segunda vez el bucle al introducir s me carga la cadena sola sin yo introducirle nada, alguien ve algun fallo?
Código (cpp) [Seleccionar]

#include <iostream>
#include <fstream>
using namespace std;

void escribe(char **name){
        ofstream fs("pw");
        fs<<*name<<endl;
        fs.close();
}
void lee(char **cadena){
        ifstream fe("pw");
        fe.getline(*cadena,30);
        cout<<*cadena<<endl;

        fe.close();
}
int main(void){
        int cont=0;
        char **cad;
        char resp='s';
        cad=new char *[100];
        do{
                cad[cont]=new char[100];
                cout<<"Cadena?: ";
                fgets(cad[cont],100,stdin);
                cont++;

                escribe(cad);
                lee(cad);
        cout<<"Mas [s/n]?: ";
        cin>>resp;
        }while(resp=='s');

        for(int i=0;i<cont;i++)
                delete[]cad[i];
        delete[]cad;
        return 0;
}


Lx

#9
Aquí te dejo tu código corregido ...


#include <iostream>
#include <fstream>
using namespace std;

void escribe(char **name, int cont){
       ofstream fs("pw.txt");
       for( int i = 0; i < cont; i++){
           fs<<name[i]<<endl;
       }
       fs.close();
}
void lee( int cont){
 
       char cadena[100];
 
       ifstream fe("pw.txt");
       for( int i = 0; i < cont; i++){
           fe.getline(cadena,100);
           cout<<cadena<<endl;
       }
       fe.close();
}
int main(void){
       int cont=0;
       char **cad;
       char resp='s';
       cad=new char *[100];
       do{
               cad[cont]=new char[100];
               cout<<"Cadena?: ";
               cin.getline(cad[cont],100);
                   
               cont++;
               escribe(cad, cont);
               lee(cont);
               cout<<"Mas [s/n]?: ";
               cin>>resp;
               while(getchar()!='\n'); // esto elimina la basura del buffer que hacía que se salte la lectura de la cadena.
       }while(resp=='s');

       for(int i=0;i<cont;i++)
               delete[]cad[i];
       delete[]cad;
       return 0;
}


El error en tu código está en que tú asumes que *cad es el conjunto de todos los cad[n], pero no es así, *cad es igual - únicamente - a cad[0], ya que *cad sólo apunta a la dirección del 1r elemento de ese vector de cadenas.