2010-04-26 637 views
9

Esta es una queja acerca de STL. ¿Por qué toman argumentos de nombre de archivo como (char *) y no como std :: string? Esto parece no tener sentido.¿por qué las clases STL ifstream y ofstream no toman std :: string como nombres de archivo?

Hay otras dos preguntas sobre este tema:

La cuestión es que tengo una gran cantidad de código que se parece a esto:

std::ofstream f(fname.c_str()); 

Cuándo me gustaría que se vea así:

std::ofstream f(fname); 

Problemas adicionales que se mencionan en las publicaciones anteriores es el problema de UTF-16 vs. UTF-8. (UTF-16 podría contener valores NULL que romperían la API POSIX). Pero eso no es realmente un problema, porque la implementación podría convertir UTF-16 a UTF-8 antes de llamar a open().

Pero en serio, esto no tiene sentido. ¿Hay algún plan para actualizar STL?

+0

¿El problema es 'char *' vs 'std :: string' o' char * 'versus' wchar_t * '? Siempre que el SO sea consistente con respecto al comportamiento de multibyte, un 'char *' debería ser suficiente. La pregunta es si se supone que 'fstream :: fstream' quiere resultados de' wcstombs' (y, simplemente, la conversión segura de 'wstring' a' string' en absoluto). – Potatoswatter

+0

Esto apesta porque, de repente, los programadores a quienes les han dicho todas las maravillas de OO y de cómo no necesitan saber cómo se implementan los objetos tienen que retroceder y aprender algunos detalles sobre cómo se combinan las cosas. – nategoose

+3

@nategoose: si por "aprender algunos detalles de cómo se juntan las cosas", quieres decir, "llama a' c_str() '", entonces sí ;-) No necesitas saber realmente qué cadena de estilo C es para este fin, solo que los parámetros del nombre de archivo necesitan uno, y que hay una forma de obtener uno. IMO un problema peor es que string + string concatena, string + literal concatena, pero literal + literal misteriosamente se bloquea ... –

Respuesta

10

¿Por qué las clases ifstream y ofstream no toman std :: string como nombres de archivo?

he visto algunos argumentos razonables para que (a saber, que esto crearía una dependencia de las corrientes en las cadenas), pero francamente creo que la verdadera razón es que las corrientes son mucho más antigua que la biblioteca estándar y sus cuerdas.

¿Hay algún plan para actualizar STL?

Se llama C++ 11 y será la nueva versión del estándar. No sé si las transmisiones de archivos han cambiado. Puedes mirar el final draft y descubrirlo por ti mismo.

Tenga en cuenta que STL es el nombre de una biblioteca de contenedores, algoritmos e iteradores, incorporada en la biblioteca estándar. También parte de la biblioteca estándar son cadenas, flujos y otros.
En particular, las transmisiones no son parte de la STL. Ellos son hermanos.

+6

Una mirada rápida al borrador muestra que 'string' se permitirá como un nombre de archivo pero' wstring' no lo hará. – Potatoswatter

+0

Gracias. Bueno, eso es menos cerebral muerto. – vy32

+0

@Potatoswatter: seguramente quiere decir que '' string' será obligatorio, pero 'wstring' es una extensión". C++ 98 permitió sobrecargas adicionales, ¿y no recuerdo un cambio allí? – MSalters

3

Motivos históricos. La biblioteca iostream se desarrolló por separado del material de cuerda. Pero nadie puede adivinar por qué esto no estaba integrado en el estándar C++. Me parece que varias preguntas sobre Usenet datan de cuando (incluida la teoría de dependencia), pero nunca una explicación realmente satisfactoria.

2

Como recuerdo, en realidad es (al menos tipo de) la situación con cadena vs. cadena de hilos. No puedo encontrar la publicación en este momento, pero estoy bastante seguro de que recuerdo una publicación de Usenet de Andrew Koenig que decía que había sido planteada por miembros de uno de los comités nacionales (Japón es lo que parece recordar, pero podría fácilmente se equivocan) planteó la cuestión de cómo podrían tratar los nombres de archivo en varios idiomas (especialmente dado que relativamente pocos sistemas operativos en ese momento proporcionaban mucho apoyo para eso).A pesar de que había comenzado muy simple, rápidamente se hizo evidente que la única manera de evitar que se convirtiera en un gran lío era dejar de hablar de la idea en general.

Cuestiones relacionadas