1

これは私が通常ファイルを読む方法ですstd::ifstream

while (InFile.peek() != EOF)
{
    char Character = InFile.get();
    // Do stuff with Character...
}

ifこれにより、ループ内のステートメントが不要になります。ただし、peek()原因も設定されているようで、後で同じストリームを使用する場合eofbitは呼び出しが必要になります。clear()

これを行うためのよりクリーンな方法はありますか?

4

2 に答える 2

2

通常は、

char x;
while(file >> x) {
    // do something with x
}
// now clear file if you want

clear()を忘れた場合は、RAIIスコープベースのクラスを使用してください。

編集:もう少し情報があれば、私はただ言うでしょう

class FileReader {
    std::stringstream str;
public:
    FileReader(std::string filename) {
        std::ifstream file(filename);
        file >> str.rdbuf();
    }
    std::stringstream Contents() {
        return str;
    }
};

これで、コピーを取得するだけで、毎回ストリームをclear()する必要がなくなります。または、自己清算の参照を持つことができます。

template<typename T> class SelfClearingReference {
    T* t;
public:
    SelfClearingReference(T& tref)
        : t(&tref) {}
    ~SelfClearingReference() {
        tref->clear();
    }
    template<typename Operand> T& operator>>(Operand& op) {
        return *t >> op;
    }
};
于 2011-04-07T14:54:24.977 に答える
0

私は上手く理解できていない気がします。 を返すときにInfile.peek()のみ設定されます。そして、それが戻った場合、後で読み取りは失敗するはずです。それが設定するという事実は、何よりも最適化です。eofbitEOFEOFeofbit

于 2011-04-07T17:26:51.590 に答える