为什么STL ifstream和ofstream类不将std :: string作为文件名?

时间:2010-04-26 21:19:06

标签: c++ stl iostream

这是关于STL的投诉。为什么他们将文件名参数作为(char *)而不是作为std :: string?这似乎毫无意义。

关于这个主题还有另外两个问题:

问题是我有很多代码如下:

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

当我希望它看起来像这样:

std::ofstream f(fname);

上述帖子中提到的其他问题是UTF-16与UTF-8的问题。 (UTF-16可能包含会破坏POSIX API的NULL)。但这不是一个真正的问题,因为实现可以在调用open()之前将UTF-16转换为UTF-8。

但严重的是,这没有任何意义。有没有计划升级STL?

3 个答案:

答案 0 :(得分:10)

  

为什么ifstream和ofstream类不将std :: string作为文件名?

我已经看到了一些合理的论据(即这将创建流对字符串的依赖),但坦率地说,我认为实际的原因是流比标准库及其字符串更老。

  

有没有计划升级STL?

它被称为C ++ 11,将成为该标准的新版本。我不知道文件流是否改变了。您可以查看final draft并自行查找。

请注意, STL 是包含在标准库中的容器,算法和迭代器库的名称。标准库的一部分也是字符串,流和其他 特别是,流不是STL的一部分。他们是兄弟姐妹。

答案 1 :(得分:3)

历史原因。 iostream库是与字符串东西分开开发的。但是为什么没有将这个集成到C ++标准中是任何人的猜测。我似乎有几个关于Usenet的问题(包括依赖理论),但从来没有一个真正令人满意的解释。

答案 2 :(得分:2)

我记得,实际上 (至少是那种)字符串与wstring的情况。我现在找不到这个帖子,但我有理由肯定我记得安德鲁科尼格的一篇Usenet帖子说它是由一个国家委员会的成员提出的(日本是我似乎记得的,但可以容易出错)提出了如何处理各种语言的文件名的问题(特别是因为当时相对较少的操作系统提供了很多支持)。即使它开始非常简单,但很快就会发现,避免它变成巨大混乱的唯一方法就是停止对这个想法的所有讨论。