2016-03-29 2 views
2

У меня есть файл с именем 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) 
{ 

} 

для того, чтобы восстановить данные учетной записи, но я застрял с поиском информации из файла , Любая помощь приветствуется!

+0

Самый простой способ - полностью прочитать ваш файл и создать «std :: vector », а затем работать с элементами этого вектора и записать его целиком. –

+1

@KenWhite Не совсем это обман. –

+0

Я понимаю, что это не то, что вы просите, но почему это в текстовом файле, а не, например. sqlite db? –

ответ

0

Рассмотрите, как это может быть достигнуто с помощью библиотеки 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 и семья могут работать одинаково хорошо. Функция на карте применяется к каждой строке (для выбранных cols, здесь 2nd col). ColsTransform гарантирует, что столбцы будут обновлены с возвращенным значением без переупорядочения.

Вы можете использовать библиотеку для выполнения общих задач обработки данных.

Смежные вопросы