почему классы STL ifstream и ofstream не принимают std :: string в качестве имен файлов? - PullRequest
9 голосов
/ 27 апреля 2010

Это жалоба на STL. Почему они принимают аргументы имени файла как (char *), а не как std :: string? Это кажется бессмысленным.

На эту тему есть еще два вопроса:

Проблема в том, что у меня много кода, который выглядит следующим образом:

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

Когда я бы хотел, чтобы это выглядело так:

std::ofstream f(fname);

Дополнительные проблемы, которые упоминаются в вышеприведенных постах, это проблема UTF-16 против UTF-8. (UTF-16 может содержать значения NULL, которые могут нарушить POSIX API). Но на самом деле это не проблема, потому что реализация может конвертировать UTF-16 в UTF-8 перед вызовом open ().

А если серьезно, это не имеет смысла. Есть ли планы по обновлению STL?

Ответы [ 3 ]

10 голосов
/ 27 апреля 2010

почему классы ifstream и ofstream не принимают std :: string в качестве имен файлов?

Я видел несколько разумных аргументов для этого (а именно, это создаст зависимость потоков от строк), но, честно говоря, я считаю, что настоящая причина в том, что потоки намного старше стандартной библиотеки и ее строк.

Есть ли планы по обновлению STL?

Он называется C ++ 11 и будет новой версией стандарта. Я не знаю, изменились ли файловые потоки. Вы можете посмотреть окончательный проект и убедиться в этом сами.

Обратите внимание, что STL - это имя библиотеки контейнеров, алгоритмов и итераторов, включенной в стандартную библиотеку. Также частью стандартной библиотеки являются строки, потоки и др.
В частности, потоки не являются частью STL. Они братья и сестры.

3 голосов
/ 27 апреля 2010

Исторические причины. Библиотека iostream была разработана отдельно от строкового материала. Но почему это не было интегрировано в C ++ Standard, можно только догадываться. Мне кажется, что когда-то в Usenet у меня было несколько вопросов (включая теорию зависимости), но никогда не было действительно удовлетворительного объяснения.

2 голосов
/ 27 апреля 2010

Насколько я помню, на самом деле - это (по крайней мере, в некотором роде) ситуация со строкой против wstring. Я не могу найти этот пост прямо сейчас, но я вполне уверен, что я помню пост Эсен Эндрю Кенига, в котором говорилось, что он был поднят членами одного из национальных комитетов (Япония, как я помню, но могла легко ошибаться) поднял вопрос о том, как они могут обращаться с именами файлов на разных языках (тем более, что относительно небольшое количество ОС в то время оказывало большую поддержку для этого). Несмотря на то, что все началось довольно просто, быстро стало очевидно, что единственный способ избежать превращения его в огромный беспорядок состоял в том, чтобы прекратить все обсуждения идеи в целом.

...