我有一个名为 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
和 family 可以同样有效。
map 中的函数应用于每一行(对于选定的列,这里是第二列)。 ColsTransform 确保列在不重新排序的情况下使用返回值进行更新。
您可以考虑将该库用于一般数据处理任务。
关于c++ - 如何接收、修改和替换文本文件中的一行?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36290508/