使用fstream读取和写入同一文件

时间:2013-12-12 13:42:37

标签: c++ fstream

void Withdraw(int index, int amount)
{
    int Balindex = 0;
    fstream input("Balance.txt");
    float balance = 0.0;
    while ((!input.eof())&&(Balindex != index))
    {
        balance = 0.0;
        input >> balance;
        Balindex++;
    }
    input >> balance;
    balance = balance - amount;
    input << balance << endl;
}

我正在尝试从文本文件中读取余额,并扣除提取的金额。 index保存余额的时间顺序。 但我的文件不会用新的值覆盖现有的值。有什么建议吗?

1 个答案:

答案 0 :(得分:5)

在没有插入搜索的情况下在文件流的输入和输出之间切换时,会得到未定义的行为。你寻求的地方并不重要,但你需要寻求!例如,您可以在当前位置之外寻找零字符,或者更有可能返回到实际开始值的位置:

std::streampos start = input.seekg(0, std::ios_base::cur);
if (input >> balance) {
    input.seekp(start);
    input << (balance - amount);
}

但请注意,流不会为其他字符腾出空间,即如果您阅读的内容比您编写的内容短,则会覆盖原始输入后的数据。同样,您只会覆盖您覆盖的字符。我建议不要做那样的事情。如果要更新文件,请确保使用固定宽度的记录!

当然,您也不应该使用input.eof()来验证流是否有用:如果流进入故障模式,例如,由于输入格式错误,您将永远无法达到input.eof()会产生true,即你会得到一个无限循环。只需使用流本身作为条件。就个人而言,我会使用像

这样的东西
while (input >> balance && Balindex != index) {
    ++Balindex;
}