Contenidos de fichero en C++

Iniciado por Fyrox, 31 Julio 2012, 02:13 AM

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

Fyrox

Saludos, sigo aqui intentando aprender un poquillo de C++ y para practicar un poco los ficheros he creado un programa que simplemente pide nombre y contenido del fichero al usuario y lo crea. El programa queda algo así.

Código (cpp) [Seleccionar]

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

int main () {
    char name[30], text[255];

    cout << "Introduzca nombre del fichero (con extension): ";
    cin >> name;
    cout << endl << "Introduca contenido del fichero: ";
    cin >> text;

    ofstream myfile;
    myfile.open (name);
    myfile << text;
    myfile.close();


}


El programa compila bien, y, aparentemente, también se ejecuta bien. El problema es que al pedirte el contenido, nada más pongas un espacio deja de recoger contenido. Es decir, si escribes "Hola que tal." el programa solo escribe "Hola". Supongo que será alguna cosilla que tenga que añadir, pero he buscado y no encuentro la solucion. Gracias de antemano.

BlackZeroX

#1
usa:

Código (cpp) [Seleccionar]


//cin >> name;
cin.getline(name, 30);

//cin >> text;
cin.getline(text, 255);



o tambien:

Código (cpp) [Seleccionar]

...
cin.getline( name, sizeof name);
...
cin.getline(text, sizeof text);
...


un poco mas: http://www.cplusplus.com/reference/iostream/istream/getline/

Dulces Lunas!¡.
The Dark Shadow is my passion.

rir3760

Como ya indico BlackZeroX (Astaroth) para leer una linea de texto de la entrada estándar debes utilizar su función miembro getline.

Antes de hacerlo debes descartar el resto de la ultima linea (por lo menos queda el avance de linea o '\n') para que no sea procesada por "getline". Eso lo puedes hacer de varias formas por ejemplo un bucle o utilizando la función miembro "ignore".

El programa con ambas correcciones es:
Código (cpp) [Seleccionar]
#include <iostream>
using std::cin;
using std::cout;
using std::endl;

#include <fstream>
using std::ofstream;

#include <limits>
using std::numeric_limits;

int main()
{
   char name[30];
   char text[255];
   
   cout << "Introduzca nombre del fichero (con extension): ";
   cin >> name;
   cin.ignore(numeric_limits<int>::max(), '\n');
   
   cout << "Introduzca contenido del fichero: ";
   cin.getline(text, sizeof text);
   
   ofstream myfile;
   myfile.open(name);
   myfile << text << endl;
   myfile.close();
   
   return 0;
}


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

Fyrox

Muchas gracias a los dos por las respuestas tan rapidas :D. En efecto, ahora el programa funciona perfectamente, pero tengo un par de preguntitas:

¿El hecho de que tenga que usar getline es porque uso arrays de tipo char en lugar de poner string? Uso arrays porque así me lo indica el libro con el que estoy aprendiendo, no sé si es más o menos correcto que usar string.

rir3760, ¿me podrías explicar como funciona exactamente la siguiente linea?
Código (cpp) [Seleccionar]
cin.ignore(numeric_limits<int>::max(), '\n');
No entiendo exactamente su funcionamiento.

Un saludo.

BlackZeroX

#4

cin.ignore(numeric_limits<int>::max(), '\n');

Ya que con solo 1 vez que se oprima el enter (genera el salto de linea '\n') termina la instruccion de lectura en cin... por lo tanto solo se necesita 1 en lugar de numeric_limits<int>::max() pero esto es optativo realmente no afecta en nada.

cin.ignore(1, '\n');

* Lo que hace ignore es ignorar N cantidad de veces un delimitador (mínimo 1 vez).
http://www.cplusplus.com/reference/iostream/istream/ignore/

* Cuando uses array usa el modo que ya se te indico si usas la clase string:

getline(cin, str); // donde str es la variable string

Nota la diferencia que no se usa cin.getline() si no solo getline().

Dulces Lunas!¡.
The Dark Shadow is my passion.

Fyrox

#5
De acuerdo. Ahora bien, otro par de preguntillas (siento ser tan pesado xD):

Si quisiera poner el siguiente código dentro de una función aparte, ¿de que tipo deberían de ser sus parámetros?
Código (cpp) [Seleccionar]

ofstream myfile;
myfile.open (name);
myfile << text;
myfile.close();


Luego, ¿que es mas recomendado usar para cadenas de caracteres, el tipo string o arrays de tipo char?

Muchas gracias :D

ecfisa

Hola fyrox.

Proba de este modo:

Código (cpp) [Seleccionar]

void GuardarTexto(ofstream &aFile, char *aFileName, char *Text){
 aFile.open(aFileName);
 aFile << Text;
 aFile.close();
}


Ejemplo de llamada:
Código (cpp) [Seleccionar]

 ...
 ofstream MyFile;
 GuardarTexto(MyFile, "C:\\C.TXT", "Un texto cualquiera");
 ...



Saludos.

BlackZeroX

#7
Si no vas a cambiar el contenido de dichas avriables puedes usa los tipos constantes.

Código (cpp) [Seleccionar]


void GuardarTexto(const char *aFileName, const char *Text){
 ofstream aFile = {}; // como esta variable la usas y la dejas de usar (abres y cierras el archivo y no haces nada mas) se declara de manera local en el proceso.
 aFile.open(aFileName);
 aFile << Text;
 aFile.close();
}



Después tendrías que ingresar los try... cath que traten las excepciones posibles con ofstream (para saber si el direcion es posible o imposible de crear o escribir o X cosa).

http://c.conclase.net/curso/?cap=043b
http://www.­cplusplus.­com/­exception

Dulces Lunas!¡.
The Dark Shadow is my passion.

rir3760

Cita de: Fyrox en 31 Julio 2012, 02:52 AMrir3760, ¿me podrías explicar como funciona exactamente la siguiente linea?
Código (cpp) [Seleccionar]
cin.ignore(numeric_limits<int>::max(), '\n');
No entiendo exactamente su funcionamiento.
Cuando se llama a la función miembro "ignore":
Código (cpp) [Seleccionar]
cin.ignore(N, 'ch');
Se descartan caracteres del stream "cin" hasta que se cumpla una de dos condiciones:
A) Se encuentra el carácter 'ch'.
B) Se descartan N caracteres.

Otra forma es mediante un bucle:
Código (cpp) [Seleccionar]
{
   char ch;
   
   while (cin.get(ch) && ch != '\n')
      ;
}


La idea de ambas es descartar el resto de la linea (sin importar el numero de caracteres que la componen).

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