C++ 为什么不';STL ifstream和ofstream类将std::string作为文件名?
这是关于STL的投诉。为什么它们将文件名参数作为(char*)而不是std::string?这似乎毫无意义 关于这个话题还有两个问题:C++ 为什么不';STL ifstream和ofstream类将std::string作为文件名?,c++,stl,iostream,C++,Stl,Iostream,这是关于STL的投诉。为什么它们将文件名参数作为(char*)而不是std::string?这似乎毫无意义 关于这个话题还有两个问题: 问题是,我有很多代码如下所示: std::ofstream f(fname.c_str()); std::ofstream f(fname); 我希望它看起来像这样: std::ofstream f(fname.c_str()); std::ofstream f(fname); 上述文章中提到的其他问题是UTF-16与UTF-8的
std::ofstream f(fname.c_str());
std::ofstream f(fname);
我希望它看起来像这样:
std::ofstream f(fname.c_str());
std::ofstream f(fname);
上述文章中提到的其他问题是UTF-16与UTF-8的问题。(UTF-16可能包含空值,这将破坏POSIXAPI)。但这不是真正的问题,因为实现可以在调用open()之前将UTF-16转换为UTF-8
但说真的,这毫无意义。是否有升级STL的计划
为什么ifstream和ofstream类不使用std::string作为文件名
我已经看到了一些合理的论据(即这将创建流对字符串的依赖性),但坦率地说,我相信实际原因是流比标准库及其字符串旧得多
是否有升级STL的计划
它被称为C++11,将是该标准的新版本。我不知道文件流是否改变了。你可以看看这本书,自己去弄清楚
请注意,STL是容器、算法和迭代器库的名称,合并到标准库中。标准库的另一部分是字符串、流和其他内容。特别是,流不是STL的一部分。他们是兄弟姐妹 历史原因。iostream库是与string库分开开发的。但是为什么没有集成在C++标准中,这是任何人的猜测。我在Usenet上看到了几个问题(包括依赖性理论),但从来没有一个真正令人满意的解释。我记得,这实际上是(至少有点)字符串与wstring的情况。我现在找不到这个帖子,但我有理由肯定我记得安德鲁·柯尼格(Andrew Koenig)在Usenet上发表的一篇帖子说,它是由一个国家委员会的成员提出的(我似乎记得日本,但很容易出错),提出了他们如何处理各种语言的文件名的问题(特别是因为当时提供大量支持的操作系统相对较少)。尽管它一开始很简单,但很快就变得明显,避免它变成一团乱麻的唯一方法就是停止对这个想法的所有讨论。快速查看草稿表明,
string
将被允许作为文件名,但wstring
不会。@Potatoswatter:你的意思当然是“string
将是必需的,但wstring
是一个扩展".C++98允许额外的重载,我不记得有什么变化?@MSalters:嗯,GNU在任何情况下都没有这样的扩展,Mac OS X在任何情况下都不提供系统调用wopen
接受wchar\u t*
。所以看起来UTF-8是一种可移植的方式。问题是char*
vsstd::string
还是char*
vswchar\u t*
?只要操作系统在多字节行为上是一致的,一个char*
就足够了。问题是fstream::fstream
是否应该喜欢wcstombs
的结果(简单地说,wstring
到字符串的安全转换)。这确实很糟糕,因为突然间,那些被告知OO的所有奇迹以及他们不需要知道对象是如何实现的程序员不得不回去学习如何组合事物的一些细节。@nategoose:如果“学习如何组合事物的一些细节”,你的意思是,“调用c_str()
”,那么是的;-)您不需要知道C样式字符串实际上是什么,只需要文件名参数需要一个,并且有一种方法可以得到一个。在我看来,更糟糕的问题是字符串+字符串连接,字符串+文字连接,但文字+文字神秘地崩溃了…我编辑了这个问题,以获得一个代码示例。我同意字面+字面是愚蠢的。在Objective-C中,有一个使用NSString的快捷方式---@“foo”给您一个“foo”字符串。没有什么像C++那样的,尽管另一种语言是为那些喜欢键入……可能复制的人创造的。