16 de enero de 2008

streams como parametros en C++

Bueno, como nunca me gustaron los char* y de los malloc y esas cosas, me decidía yo a darle al C++, que para esas cosas es (al parecer) algo más sencillo. Tengo muchas cadenas de caracteres de longitud desconocida, así que me pareció muy cómodo utilizar los tipos de dato string. Y oye, perfecto, un par de problemillas, pero bien.

Pensaba yo que sería igual de fácil para los ficheros, y es que lo del tipo ofstream tenía muy buena pinta, ya que puedes hacer cosas como:

mifichero << "holahola"; //Supongo que algunos sabéis de lo que hablo. Otros igual queréis llorar, no se...

pero supongamos que quiero hacerlo por parámetros. Por ejemplo, una función que tiene como parámetros el fichero donde quiero insertar la frase y la frase en sí. Algo así como esto:

void Insertar (stream file, string frase); //Lo hago un poco de memoria, es muy posible que esto que acabo de poner sea un asco.

Bien, pues como tampoco tenía mucho tiempo para pensar, he pasado de darle muchas vueltas: lo del string es fácil por que con su método c_str() se obtiene un char* que ya es fácil de tratar, ya sea dentro de la función o fuera. En el caso del fichero he tenido que abandonar, de forma que al final pienso que una solución alternativa es esto:

void Insertar(FILE* file, char* frase); //Lo del c_str() lo hago fuera de la función.

Es decir, con los ficheros tratados por el método tradicional de C, aunque es una solución algo cobarde =). Por ello, admito sugerencias para introducir archivos como parámetro en una función con código únicamente de C++.

2 comentarios:

Anónimo dijo...

"Use the pointer Luc, use the pointer..."

Atención a la nota 2

http://pages.cs.wisc.edu/~hasti/cs368/CppTutorial/NOTES/IO.html

I/O Parameters

It is often useful to write a function that takes an input stream or an output stream as a parameter, and reads from or writes to the given stream (without worrying about whether it is using the standard input/output or a particular file). To do this, you should use parameters of type istream (for input), and ostream (for output). For example:

void f( istream & input, ostream & output ) {
int n;
output << "enter a number: ";
input >> n;
}

Note:

1. "input" and "output" are the names used in the example for the two parameters, but there is nothing special about those names; as usual, it is up to the programmer to choose parameter names.

2. The ampersands in front of the parameter names mean that the two parameters are passed by reference. The difference between value parameters and reference parameters will be discussed in another set of notes. For now, just remember that input and output streams must always be passed by reference (or you will get a not-very-clear compile-time error).

3. A call to function f can pass either the standard input or a file (an ifstream) as the first parameter, and can pass either the standard output, the standard error, or a file (an ofstream) as the second parameter.

Manu dijo...

I know, Master, I know...

Si el caso es que sabía que debía meterlos por referencia, pero está claro que lo debí hacer mal =)

Gracias, ya me lo se para la próxima vez... te puedo llamar Yoda a partir de ahora?? =P