Hola
Estaba leyendome el libro C++ Primer Plus 6th de Prata para refrescar un poco mi C++ y tengo una duda sobre un ejemplo sobre I/O de archivos.
En la página 1117 hay un ejemplo en el que entre otras cosas escriben esto:
string filename;
cout << "Enter filename";
cin >> filename;
ofstream fout(filename.c_str());
y dice que se usa c_str() para pasar el nombre, que es un string, como parámetro...
En la página 1121 en otro ejemplo se usa
fin.open(argv[number]);
¿Por qué no se usa también el .c_str() en este caso?
saludos
Hola skan en ese caso no utiliza .c_str() porque le pasa como argumento el parámetro o los parámetros que se le pasan al programa por consola.
Hola
Sí, pero ese argv[numero] es como un puntero a un "string", ¿no?
A un string no, es un puntero a un char vamos lo que retorna contiene es (char*) la dirección de una cadena, que será el parámetro ubicado en la posición numero.
.c_str() es una funcion de la clase string para convertir los strings a cadenas char* clasicas.
El ARGV es una cadena char* clasica, lo mismo que poner el nombre entre comillas:
ofstream fout("Un archivo.txt");
Es que me extraña que de el mismo modo no se pueda escribir
string filename;
cout << "Enter filename";
cin >> filename;
ofstream fout(filename);
sin usar el c_str(), simplemente cogiendo el string como input.
Explico mejor.
Una cadena char*, no son mas que los caracteres puestos en fila. Ahí no hay problema alguno.
Un string, es un contenedor/objeto para facilitar el trabajo con cadenas de caracteres. Este objeto tiene sus datos, sus funciones y sus operaciones... No es una cadena de caracteres propiamente dicha.
Su funcion .c_str() obtiene del string un texto leible y entendible.
Lo normal para funciones de la librería estándar que requieran una cadena de caracteres es que acepten un objeto de la clase string, sin embargo los constructores de las clases para I/O no lo han hecho hasta el más reciente estándar de C++, el 11.