failbit与ifstream对象一起设置,可能是什么原因?

时间:2019-02-01 09:32:20

标签: c++

我编写了一个小型C ++程序来在文本文件中设置属性。实现如下:

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

using namespace std;

const string PROPFILE = "./propfile";
const string TEMPFILE = PROPFILE + ".tmp";

int setProp(const string &key, const string &val) {

    try {
        ifstream original(PROPFILE, ios::in);
        ofstream tempfile(TEMPFILE, ios::out | ios::trunc);

        for (string line; getline(original, line); ) {
            if (line.compare(0, key.size(), key) == 0 && line[key.size()] == '=') {
                tempfile << key << '=' << val << endl;
            } else {
                tempfile << line << endl;
            }
        }

        cout << "original.rdstate()" << original.rdstate() << endl;

        original.close();
        tempfile.close();

    } catch (ifstream::failure e) {
        cerr << e.what() << endl;
    }

    if (rename(TEMPFILE.c_str(), PROPFILE.c_str()) != 0) {
        cout << "Could not move " + TEMPFILE << "to " << PROPFILE << endl;
        return 1;
    }
    return 0;
}

int main(int argc, const char *argv[]) {
    try {
        return setProp(argv[1], argv[2]);
    } catch (logic_error) {
        cout << "Invalid args" << endl;
        return 1;
    }
}

但是,当我尝试通过./a.out TESTPROP TESTVALUE从命令行编译并执行它时,该值是在propfile中按预期设置的,但是rdstate()返回6(这意味着设置了failbit和eofbit),我不能了解他们为什么会被设置,有人可以解释吗?

运行./a.out TESTPROP TESTVALUE之前propfile的内容是:

TESTPROP=NOTHING

运行程序后

TESTPROP=TESTVALUE

我只是一个学生,请不要介意这是一个愚蠢的问题:)

1 个答案:

答案 0 :(得分:0)

这是预期的行为,每当有一个读取故障期望值failbit被设置。即使故障是因为文件结束的。

例如见here

  

如果提取无论出于何种原因没有字符(即使不是   丢弃分隔符),函数getline套failbit并返回。