我编写了一个小型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
我只是一个学生,请不要介意这是一个愚蠢的问题:)
答案 0 :(得分:0)
这是预期的行为,每当有一个读取故障期望值failbit被设置。即使故障是因为文件结束的。
例如见here
如果提取无论出于何种原因没有字符(即使不是 丢弃分隔符),函数getline套failbit并返回。