文件写入的有关问题
文件写入的问题
我编写了一个ATM机的模拟程序,运行程序,先从存有账户记录的文件中读取所有的账户信息,并用一个容器存储记录。当用户修改密码或提款时,修改相应的账户信息,并用新的信息覆盖掉该账户原有的信息。下面的函数实现此功能:首先,读取旧文件的账户信息,根据账户的账号依次查找对应的账户信息。一旦找到,就把新的账户信息写入对应的行。
账户信息的文件格式是:
134671 zhangsan 12356.42 134671$
158231 lisi 12356.42 158231$
181791 wangwu 12356.42 181791$
一行存储一个账户信息:账号 姓名 余额 密码$
用空格作为账户信息内部的分隔符,用$作为一条信息的终至符。
void Atm::UpdateAccountFile()
{
size_t count = 0;
double balance;
string accountList;
string strTemp;
Account AccountTemp;
size_t positionPre = 0;
size_t positionPost = 0;
size_t accountListCount = 0;
fstream inOut;
inOut.open(m_accountFile.c_str(), fstream::in | fstream::out);
while (getline(inOut, accountList))//读取一行记录
{
accountListCount = accountList.size();
positionPost = accountList.find_first_of( "$ ", positionPre);//确定$所在位置
strTemp = accountList.substr(positionPre, positionPost);//剥离出账户信息字符串
accountList = strTemp;
positionPost = accountList.find_first_of( " ", positionPre);//获得第一个空格所在位置
strTemp = accountList.substr(positionPre, (positionPost - positionPre));//获得账户的账号
if (m_accountVec[m_index].GetNumber() == strTemp)//如果此账号是需要重新写入的账号
{
inOut.seekg(0 - accountListCount - 2, ios::cur);//重定位文件指针为行首
inOut < < m_accountVec[m_index].GetNumber() < < ' '
< <m_accountVec[m_index].GetName() < < ' '
< < GetStrFromNum(balance) < < ' '
< < m_accountVec[m_index].GetPassword() < < '$ ';//写入新的账户信息
count = (m_accountVec[m_index].GetNumber()).size() +
(m_accountVec[m_index].GetName()).size() +
(m_accountVec[m_index].GetPassword()).size() +
(GetStrFromNum(balance)).size() + 3 + 1;//新的账户信息的字符串长度
if (count < accountListCount)//如果修改后的账户信息字符串长度小于修改前长度,则进行如下操作:用 '\0 '填充,并以 '\n '结束。
我编写了一个ATM机的模拟程序,运行程序,先从存有账户记录的文件中读取所有的账户信息,并用一个容器存储记录。当用户修改密码或提款时,修改相应的账户信息,并用新的信息覆盖掉该账户原有的信息。下面的函数实现此功能:首先,读取旧文件的账户信息,根据账户的账号依次查找对应的账户信息。一旦找到,就把新的账户信息写入对应的行。
账户信息的文件格式是:
134671 zhangsan 12356.42 134671$
158231 lisi 12356.42 158231$
181791 wangwu 12356.42 181791$
一行存储一个账户信息:账号 姓名 余额 密码$
用空格作为账户信息内部的分隔符,用$作为一条信息的终至符。
void Atm::UpdateAccountFile()
{
size_t count = 0;
double balance;
string accountList;
string strTemp;
Account AccountTemp;
size_t positionPre = 0;
size_t positionPost = 0;
size_t accountListCount = 0;
fstream inOut;
inOut.open(m_accountFile.c_str(), fstream::in | fstream::out);
while (getline(inOut, accountList))//读取一行记录
{
accountListCount = accountList.size();
positionPost = accountList.find_first_of( "$ ", positionPre);//确定$所在位置
strTemp = accountList.substr(positionPre, positionPost);//剥离出账户信息字符串
accountList = strTemp;
positionPost = accountList.find_first_of( " ", positionPre);//获得第一个空格所在位置
strTemp = accountList.substr(positionPre, (positionPost - positionPre));//获得账户的账号
if (m_accountVec[m_index].GetNumber() == strTemp)//如果此账号是需要重新写入的账号
{
inOut.seekg(0 - accountListCount - 2, ios::cur);//重定位文件指针为行首
inOut < < m_accountVec[m_index].GetNumber() < < ' '
< <m_accountVec[m_index].GetName() < < ' '
< < GetStrFromNum(balance) < < ' '
< < m_accountVec[m_index].GetPassword() < < '$ ';//写入新的账户信息
count = (m_accountVec[m_index].GetNumber()).size() +
(m_accountVec[m_index].GetName()).size() +
(m_accountVec[m_index].GetPassword()).size() +
(GetStrFromNum(balance)).size() + 3 + 1;//新的账户信息的字符串长度
if (count < accountListCount)//如果修改后的账户信息字符串长度小于修改前长度,则进行如下操作:用 '\0 '填充,并以 '\n '结束。