1

我认为我目前不太了解 io 流标志的机制。为了试图理解这一点,我将就两个具体例子提出问题。


第一个涉及开放模式。例如,对于 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 */,重置badbittofalse和设置eofbitto true(这个操作在这里没有意义,只是为了理解这些位的行为)。


4

1 回答 1

1

为了:

  1. 您在 `std::ofstream` 上调用 open。`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` 没有提供任何读取它的函数,但您可以从 `rdbuf` 返回的 `streambuf` 创建一个 `std::istream` 并从中读取。
  4. 在这种情况下,`stream.clear(std::ios_base::eofbit)` 可以解决问题。但是你不能总是重置 `badbit`:如果没有附加 `streambuf`,无论你做什么,`badbit` 都会被设置。

正如您可能注意到的那样,名称并不总是直观的:clear设置一点,并且关于打开标志的逻辑远非正交。

于 2012-10-05T16:15:23.747 回答