如何接收、修改和替换文本文件中的一行

How to take in, modify and replace a line in a text file?

本文关键字:一行 文件 何接收 修改 文本 替换      更新时间:2023-10-16

我有一个名为accounts.txt的文件,其格式如下:

firstName lastName | cardNum | pin | balance | status | dateCreated
--------------------------------------------------------------------
John Smith | 8947 | 1234 | 0 | open | 2016-03-29.12:30:01
Mike Casey | 9322 | 1111 | 0 | open | 2016-03-29.12:30:11

我希望能够循环浏览文件并更改特定条目。例如,如果我想转到cardNum=9322并更改余额,我必须搜索第三个竖线('|')并输入数字,直到第四个竖线为止('|]),编辑数字并重新输出,对吗?

问题是,我是c++的新手,我不知道如何定位第三个("|")并在它重新输出后编辑它。我知道我必须读入整个文件,然后输出到一个新文件。这就是我创建新帐户的方式:

void AccountHandler::createAccount() //Account creation function
{
//create account in format: { First Last | cardNum | pin | balance | status | accInfo }
struct bankAccount newacc;
ofstream accounts;
string tempPin1, tempPin2;
if (!accounts.is_open())
{
    accounts.open("accounts.txt", ios::app);
}
std::cout << "Thanks for choosing to bank with ATM406, let's get started!" << std::endl;
std::cout << "Please enter your name (First Last): ";
//SET NAME ON ACCOUNT
getline (cin, newacc.name);
//SET SECURITY PIN ON ACCOUNT
for (;;)
{
    std::cout << "nPlease enter a four-digit pin to secure your account: ";
    getline (cin, tempPin1);
    std::cout << "nPlease re-enter your four-digit pin for verification: ";
    getline (cin, tempPin2);
    if (tempPin1 != tempPin2) //Pins did not match
    {
        std::cout << "The pins did not match!" << std::endl;
    }
    else //Pins match
    {
        newacc.pin = tempPin1;
        break;
    }
}
//ASSIGN A RANDOM FOUR-DIGIT CARD NUMBER FROM 1000-9999
srand(time(NULL));
ostringstream convert;
convert << rand() % 9000 + 1000;
newacc.cardNum = convert.str();
//ASSIGN A STARTING BALANCE OF 0$
newacc.balance = "0";
//CREATE DATE OF ACCOUNT CREATION
newacc.accInfo = currentDateTime();
//SET STATUS OF ACCOUNT
newacc.LOCKED = false;
string status;
if (newacc.LOCKED == false)
    status = "open";
//PUSH INFO TO TEXT FILE
accounts << newacc.name << " | " << newacc.cardNum << " | " << newacc.pin << " | " << newacc.balance << " | " 
    << status << " | " << newacc.accInfo << std::endl;
//CLOSE FILE
accounts.close();
}

我希望创建一个函数,如:

struct bankAccount AccountHandler::getAccount(string cardNum)
{
}

为了检索帐户信息,但我一直在从文件中查找信息。感谢您的帮助!

考虑如何使用easyLambda库实现这一点。

ezl::rise(
  ezl::readFile<string, array<int, 3>, array<string, 2>>(fileName)
    .colSeparator("|"))
.map<2>([](array<int,3> cardPinBal) { // 2nd column selected for lambda
  if (cardPinBal[0] == 9322) cardPinBal[2] = newBal;
  return cardPinBal;
}).colsTransform().dump("updatedInfo.txt")
.run();

这里,readFile读取数据文件,类型用于每行的列。它使用readLine来读取行,并在colSeparators上对每行进行字符串拆分。使用boost lexical cast将字符串转换为类型,但是stoi和族可以同样好地工作。映射中的函数应用于每一行(对于所选列,此处为第二列)。ColsTransform确保列在不重新排序的情况下使用返回值进行更新。

您可以考虑将库用于常规数据处理任务。