Разница между использованием конструктора fstream и открытой функции

У меня простой вопрос о конструкторе fstream и функции .open. Есть ли различия между следующими двумя выражениями?

1

fstream("file.txt",ios::app);

2

fstream fin;
fin.open("file.txt",ios::app);

Для (1) мне не нужно снова использовать функцию .open, верно? Есть ли функциональные различия между двумя выражениями?

Мой второй вопрос: если я оставлю открытый режим пустым, каким будет открытый режим по умолчанию?


person jackycflau    schedule 07.10.2015    source источник
comment
Я отвечу только на твой первый вопрос. Пожалуйста, задавайте только один вопрос на вопрос. Кроме того, вы можете ответить на второй вопрос, прочитав за десять секунд документацию по вашей любимой стандартной библиотеке C ++.   -  person Lightness Races in Orbit    schedule 07.10.2015
comment
en.cppreference.com/w/cpp/io/basic_fstream/basic_fstream   -  person Lightness Races in Orbit    schedule 07.10.2015
comment
о, я ищу на каком-то сайте свой второй вопрос ... это ios_base :: in | ios_base :: out?   -  person jackycflau    schedule 07.10.2015
comment
Да, как сказано в документации, с которой я вас связал!   -  person Lightness Races in Orbit    schedule 07.10.2015
comment
В вашей первой версии вы пропустили идентификатор, создавая временный. Возможно, вы имели в виду: fstream fin("file.txt",ios::app);?   -  person Galik    schedule 07.10.2015
comment
@Galik нет ... Я просто использую конструктор fstream   -  person jackycflau    schedule 07.10.2015


Ответы (4)


Нет никаких различий в состоянии объектов, следующих за двумя вашими фрагментами.

Почему две версии?

  1. Ctor существует для создания fstream объектов, которые сразу связываются с потоком.

  2. open существует, потому что эти типы объектов не могут быть скопированы. Следовательно, вы не можете назначить объект fstream другому потоку, написав:

    fstream foo('bblskd');
    // ...
    foo = fstream('skdjf');
    

(Обратите внимание, что этот интерфейс был разработан до семантики перемещения).


Вы можете найти открытый режим по умолчанию здесь.

person Ami Tavory    schedule 07.10.2015

Нет, никаких отличий нет.

person Lightness Races in Orbit    schedule 07.10.2015

Для (1) мне не нужно снова использовать функцию .open, верно?

Это правильно.

Есть ли функциональные различия между двумя выражениями?

Не то чтобы я мог подумать.

Мой второй вопрос: если я оставлю открытый режим пустым, каким будет открытый режим по умолчанию?

Это ios_base::in|ios_base::out. См. http://en.cppreference.com/w/cpp/io/basic_fstream/open для получения более подробной информации.

person R Sahu    schedule 07.10.2015

Это действительно старый вопрос, но, на мой взгляд, ни один из ответов не верен.

Обе версии одинаковы. Но причина наличия отдельного open - когда вы хотите создать свой собственный класс, унаследованный от basic_fstream. И вы хотите что-то сделать с вводом в конструктор до и / или после.

class MoleStream : public std::basic_fstream<char> {
public:
    MoleStream () : std::basic_fstream<char> ("defaultmole") { }

    MoleStream ( const char *fn ) {
        std::string s = fn; s+=".mole";
        std::basic_fstream<char>::open (s);
        if ( !is_open() )
            std::basic_fstream<char>::open (fn);
    }
};

Второй конструктор MoleStream выполняет действия до и после открытия. Это может быть не очень хорошей практикой в ​​C ++, но может быть полезно.

person starmole    schedule 04.08.2017