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

标签 c++

我有一个名为 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/

相关文章:

c++ - 简单的for循环我想不通

c++ - c++中 vector 的clear()和erase()方法之间的区别?

c++ - 堆栈展开是否会释放在堆上分配的内存?

c++ - 为什么STL中队列有front而priority queue有top?

c++ - Qt 禁用 Windows 10 游戏栏

c++ - (2.3.1) 将背景纹理的比例设置为渲染窗口大小

C++构造函数中的通用引用和返回值优化(rvo)

c++ - 如何使用 GCC 配置 Mono Include Directory 路径

c++ - 使用 `std::conditional_t` 根据其模板参数定义类的 `typedef`

c++ - "hello world"string literal 可以赋给char * 类型吗?