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?
¿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
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
@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 ... –