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保存余额的时间顺序。 但我的文件不会用新的值覆盖现有的值。有什么建议吗?
答案 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;
}