替换txt文件中的行c ++

Replace line in txt file c++

我只是想知道,因为我在 accounts.txt[=14= 中有一个包含 STATUS:USERID:PASSWORD 的文本文件]

示例如下:

OPEN:bob:askmehere:

OPEN:john:askmethere:

LOCK:rob:robmypurse:

我的主界面中有一个用户输入,这样用户可以登录 3x,否则状态将从打开变为锁定

john

3 次尝试后的示例

之前:

OPEN:bob:askmehere:

OPEN:john:askmethere:

LOCK:rob:robmypurse:

之后:

OPEN:bob:askmehere:

LOCK:john:askmethere:

LOCK:rob:robmypurse:

我所做的是:

void lockUser(Accounts& in){
// Accounts class consist 3 attributes (string userid, string pass, status)

ofstream oFile;
fstream iFile;
string openFile="accounts.txt";
string status, userid, garbage;
Accounts toupdate;

oFile.open(openFile);
iFile.open(openFile);

    while(!iFile.eof()){

        getline(iFile, status, ':');
        getline(iFile, userid, ':');
        getline(iFile, garbage, '\n');


        if(userid == in.getUserId()){

            toupdate.setUserId(in.getuserId());
            toupdate.setPassword(in.getPassword());
            toupdate.setStatus("LOCK");
            break;
    }

    //here i should update the account.txt how do i do that?
    ofile.open(openFile);

    ofile<<toupdate.getStatus()<<":"<<toupdate.getUserId()":"<<toupdate.getPassword()<<":"<<endl;
}

有两种常用的方法来替换或以其他方式修改文件。第一种 "classic" 方法是逐行读取文件,检查需要修改的行,然后写入 临时 文件。当您到达输入文件的末尾时关闭它,并将临时文件重命名为输入文件。

另一种常见的方式是当文件比较小,或者你的内存很大,就是全部读入内存,做需要的修改,然后把内存中的内容写到文件中. 将其存储在内存中的方式可以不同,例如包含文件行的向量,或包含文件中所有字符且没有分隔的向量(或其他缓冲区)。

您的实现存在缺陷,因为您在循环内打开了输出文件(与输入文件相同)。这样做的第一个问题是,如果您已经打开文件进行读取,操作系统可能不允许您打开文件进行写入,并且由于您不检查打开文件是否失败,因此您不会知道这一点。另一个问题是,如果操作系统允许,那么您对 ​​open 的调用将截断现有文件,导致您丢失除第一行以外的所有内容。


简单的伪代码来解释

std::ifstream input_file("your_file");
std::vector<std::string> lines;
std::string input;
while (std::getline(input_file, input))
    lines.push_back(input);

for (auto& line : lines)
{
    if (line_needs_to_be_modified(line))
        modify_line_as_needed(line);
}

input_file.close();

std::ofstream output_file("your_file");
for (auto const& line : lines)
    output_file << line << '\n';

使用 ReadLine 找到你想要替换的行,然后使用 replace 来替换你想要替换的东西。例如写:

string Example = "Text to find";
openFile="C:\accounts.txt"; // the path of the file
ReadFile(openFile, Example);

#include <fstream>
#include <iostream>
#include <string>

int main() {
    ifstream openFile;
    string ExampleText = BOB;
    openFile("accounts.txt");
    openFile >> ExampleText;
    openFile.replace(Example, "Hello");
}