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

 

 


Tema destacado: Rompecabezas de Bitcoin, Medio millón USD en premios


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación C/C++ (Moderadores: Eternal Idol, Littlehorse, K-YreX)
| | |-+  Contenidos de fichero en C++
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] Ir Abajo Respuesta Imprimir
Autor Tema: Contenidos de fichero en C++  (Leído 3,237 veces)
Fyrox

Desconectado Desconectado

Mensajes: 35


Ver Perfil
Contenidos de fichero en C++
« en: 31 Julio 2012, 02:13 am »

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
  1. #include <iostream>
  2. #include <fstream>
  3. using namespace std;
  4.  
  5. int main () {
  6.    char name[30], text[255];
  7.  
  8.    cout << "Introduzca nombre del fichero (con extension): ";
  9.    cin >> name;
  10.    cout << endl << "Introduca contenido del fichero: ";
  11.    cin >> text;
  12.  
  13.    ofstream myfile;
  14.    myfile.open (name);
  15.    myfile << text;
  16.    myfile.close();
  17.  
  18.  
  19. }
  20.  

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.


En línea

BlackZeroX
Wiki

Desconectado Desconectado

Mensajes: 3.158


I'Love...!¡.


Ver Perfil WWW
Re: Contenidos de fichero en C++
« Respuesta #1 en: 31 Julio 2012, 02:27 am »

usa:

Código
  1.  
  2. //cin >> name;
  3. cin.getline(name, 30);
  4.  
  5. //cin >> text;
  6. cin.getline(text, 255);
  7.  
  8.  

o tambien:

Código
  1. ...
  2. cin.getline( name, sizeof name);
  3. ...
  4. cin.getline(text, sizeof text);
  5. ...
  6.  

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

Dulces Lunas!¡.


« Última modificación: 31 Julio 2012, 02:38 am por BlackZeroX (Astaroth) » En línea

The Dark Shadow is my passion.
rir3760


Desconectado Desconectado

Mensajes: 1.639


Ver Perfil
Re: Contenidos de fichero en C++
« Respuesta #2 en: 31 Julio 2012, 02:46 am »

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
  1. #include <iostream>
  2. using std::cin;
  3. using std::cout;
  4. using std::endl;
  5.  
  6. #include <fstream>
  7. using std::ofstream;
  8.  
  9. #include <limits>
  10. using std::numeric_limits;
  11.  
  12. int main()
  13. {
  14.   char name[30];
  15.   char text[255];
  16.  
  17.   cout << "Introduzca nombre del fichero (con extension): ";
  18.   cin >> name;
  19.   cin.ignore(numeric_limits<int>::max(), '\n');
  20.  
  21.   cout << "Introduzca contenido del fichero: ";
  22.   cin.getline(text, sizeof text);
  23.  
  24.   ofstream myfile;
  25.   myfile.open(name);
  26.   myfile << text << endl;
  27.   myfile.close();
  28.  
  29.   return 0;
  30. }

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
Fyrox

Desconectado Desconectado

Mensajes: 35


Ver Perfil
Re: Contenidos de fichero en C++
« Respuesta #3 en: 31 Julio 2012, 02:52 am »

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
  1. cin.ignore(numeric_limits<int>::max(), '\n');
No entiendo exactamente su funcionamiento.

Un saludo.
En línea

BlackZeroX
Wiki

Desconectado Desconectado

Mensajes: 3.158


I'Love...!¡.


Ver Perfil WWW
Re: Contenidos de fichero en C++
« Respuesta #4 en: 31 Julio 2012, 04:20 am »


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!¡.
« Última modificación: 31 Julio 2012, 04:46 am por BlackZeroX (Astaroth) » En línea

The Dark Shadow is my passion.
Fyrox

Desconectado Desconectado

Mensajes: 35


Ver Perfil
Re: Contenidos de fichero en C++
« Respuesta #5 en: 31 Julio 2012, 18:57 pm »

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
  1. ofstream myfile;
  2. myfile.open (name);
  3. myfile << text;
  4. myfile.close();

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

Muchas gracias :D
« Última modificación: 31 Julio 2012, 18:59 pm por Fyrox » En línea

ecfisa

Desconectado Desconectado

Mensajes: 114


Ver Perfil
Re: Contenidos de fichero en C++
« Respuesta #6 en: 31 Julio 2012, 19:33 pm »

Hola fyrox.

Proba de este modo:

Código
  1. void GuardarTexto(ofstream &aFile, char *aFileName, char *Text){
  2.  aFile.open(aFileName);
  3.  aFile << Text;
  4.  aFile.close();
  5. }
  6.  

Ejemplo de llamada:
 
Código
  1.  ...
  2.  ofstream MyFile;
  3.  GuardarTexto(MyFile, "C:\\C.TXT", "Un texto cualquiera");
  4.  ...
  5.  


Saludos.
En línea

BlackZeroX
Wiki

Desconectado Desconectado

Mensajes: 3.158


I'Love...!¡.


Ver Perfil WWW
Re: Contenidos de fichero en C++
« Respuesta #7 en: 31 Julio 2012, 21:28 pm »

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

Código
  1.  
  2. void GuardarTexto(const char *aFileName, const char *Text){
  3.  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.
  4.  aFile.open(aFileName);
  5.  aFile << Text;
  6.  aFile.close();
  7. }
  8.  
  9.  

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!¡.
« Última modificación: 31 Julio 2012, 21:32 pm por BlackZeroX (Astaroth) » En línea

The Dark Shadow is my passion.
rir3760


Desconectado Desconectado

Mensajes: 1.639


Ver Perfil
Re: Contenidos de fichero en C++
« Respuesta #8 en: 1 Agosto 2012, 16:06 pm »

rir3760, ¿me podrías explicar como funciona exactamente la siguiente linea?
Código
  1. cin.ignore(numeric_limits<int>::max(), '\n');
No entiendo exactamente su funcionamiento.
Cuando se llama a la función miembro "ignore":
Código
  1. 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
  1. {
  2.   char ch;
  3.  
  4.   while (cin.get(ch) && ch != '\n')
  5.      ;
  6. }

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

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
Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  

Mensajes similares
Asunto Iniciado por Respuestas Vistas Último mensaje
Gestores de contenidos
Desarrollo Web
mars 6 3,903 Último mensaje 19 Septiembre 2011, 18:22 pm
por mars
Repsol se anuncia en una web con contenidos xenófobos y homófobos
Noticias
wolfbcn 2 1,697 Último mensaje 6 Agosto 2012, 01:10 am
por dimitrix
Ver contenidos multimedia de pc atv
Redes
matraco44 0 1,509 Último mensaje 8 Agosto 2012, 12:56 pm
por matraco44
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines