Понимание файловых флагов / битов

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


Первый касается открытого режима.
Например, для std :: ofstream мы имеем:

void open ( const char * filename, ios_base::openmode mode = ios_base::out );

app (append) Set the stream's position indicator to the end of the stream before each output operation.
ate (at end) Set the stream's position indicator to the end of the stream on opening.
binary  (binary) Consider stream as binary rather than text.
in  (input) Allow input operations on the stream.
out (output) Allow output operations on the stream.
trunc   (truncate) Any current content is discarded, assuming a length of zero on opening.

У меня есть следующие вопросы:

std::ofstream stream;

// Question 1 : Here I don't specify std::ios::out, so why does it work ? :
stream.open("file.txt", std::ios::binary);

// Question 2 : Here I activate trunc, but how can I deactivate it ?
stream.open("file.txt", std::ios:binary | std::ios::trunc);

// Question 3 : What would be the result of that ?
stream.open("file.txt", std::ios::in);

Второй касается государственных флагов. Рассмотрим следующий пример:

std::ofstream stream;
std::cout<<stream.good()<<stream.bad()<<stream.fail()<<stream.eof()<<std::endl;
stream<<'x';
std::cout<<stream.good()<<stream.bad()<<stream.fail()<<stream.eof()<<std::endl;
/* SOMETHING */

Поскольку ни один файл не открыт, результатом является:

1000 // <- Good bit is true
0110 // <- Fail and bad bit are true

Вопрос 4: какой кусок кода я могу написать вместо /* SOMETHING */, чтобы сбросить badbit в false и установить eofbit в true (эта операция здесь не имеет смысла, но она просто для понимания поведения этих битов).


1

Решение

С целью:

  1. Вы вызываете open на `std :: ofstream`. Определение
    `std :: ofstream :: open` — это:

    rdbuf () -> open (имя, режим | std :: ios_base :: out);
    

    Другими словами, `std :: ofstream` всегда добавляет бит` out` при открытии.

  2. Вы можете добавить `std :: ios_base :: app` к флагам режима, но это
    имеет эффект принудительного выполнения каждой записи в конец файла, независимо от
    где вы могли бы быть расположены раньше. (Это наверное то что ты хочешь
    если вы открываете только в записи.) В противном случае, если вы открываете с обоими
    `std :: ios_base :: in` и` sdt :: ios_base :: out`, файл не будет
    усеченный.
  3. Файл не будет усечен :-). В то время как `ofstream` не обеспечивает
    любые функции для чтения из него, вы можете создать `std :: istream` из
    `streambuf` возвращается` rdbuf` и читается из него.
  4. В этом случае `stream.clear (std :: ios_base :: eofbit)` будет делать
    трюк. Но вы не можете всегда сбрасывать `badbit`: если нет` streambuf`
    прикрепленный, `badbit` будет установлен независимо от того, что вы делаете.

Как вы могли заметить, имена не всегда интуитивно понятны: clear установить
немного, и логика далеко не ортогональна по отношению к открытому
флаги.

1

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]