Nicolai Josuttis在他的书中说,开放成员函数不会清除状态标志.这不是我在VS2010中发现的.这是MS问题吗?

Bel*_*loc 5 c++ filestream visual-studio-2010 visual-c++

Nicolai Josuttis在他的书"The C++ Standard Library"的第547页中描述了以下与以下代码相关的内容:

Note that after the processing of a file, clear() must be called to clear the state flags that are set at end-of-file. This is required because the stream object is used for multiple files. The member function open() does not clear the state flags. open() never clears any state flags. Thus, if a stream was not in a good state, after closing and reopening it you still have to call clear() to get to a good state. This is also the case, if you open a different file.

// header files for file I/O
#include <fstream>
#include <iostream>
using namespace std;
/* for all file names passed as command-line arguments
* - open, print contents, and close file
*/
int main (int argc, char* argv[])
{
    ifstream file;
    // for all command-line arguments
    for (int i=1; i<argc; ++i) {
        // open file
        file.open(argv[i]);
        // write file contents to cout
        char c;
        while (file.get(c)) {
            cout.put(c);
        }
        // clear eofbit and failbit set due to end-of-file
        file.clear();
        // close file
        file.close();
    }
}
Run Code Online (Sandbox Code Playgroud)

我的代码在VS2010中没有问题.请注意,在创建文件"data.txt"之后,它会在不清除输入流标志的情况下读取两次.

#include <iostream>
#include <fstream>
#include <string>

int main()
{
    //  Create file "data.txt" for writing, write 4 lines into the file and close the file.

    std::ofstream out("data.txt");
    out << "Line 1" << '\n' << "Line 2" << '\n' << "Line 3" << '\n' << "Line 4" << '\n';
    out.close();

    //  Open the file "data.txt" for reading and write file contents to cout

    std::ifstream in("data.txt");
    std::string s;
    while( std::getline(in, s) ) std::cout << s << '\n';
    std::cout << '\n';
    std::cout << std::boolalpha << "ifstream.eof() before close - " << in.eof() << '\n';

    //  Close the file without clearing its flags

    in.close();
    std::cout << std::boolalpha << "ifstream.eof() after close - " << in.eof() << '\n';

    //  Open the file "data.txt" again for reading

    in.open("data.txt");
    std::cout << std::boolalpha << "ifstream.good() after open - " << in.good() << '\n';
    std::cout << '\n';

    //  Read and print the file contents

    while( std::getline(in, s) ) std::cout << s << '\n';
    std::cout << '\n';
}
Run Code Online (Sandbox Code Playgroud)

输出继电器

在此输入图像描述

Pet*_*ker 4

C++11 对此进行了更改。C++98 规则(如 Josuttis 正确描述的那样)显然是错误的,因此如果实现不遵守它,我不会感到惊讶。