替换txt文件中的行c ++

时间:2015-01-23 10:19:19

标签: c++ fstream ostream

我只是想知道我在 accounts.txt

中有一个包含 STATUS:USERID:PASSWORD 的文本文件

示例看起来像这样:

  
    

OPEN:鲍勃:askmehere:

         

OPEN:约翰:askmethere:

         

LOCK:抢:robmypurse:

  

我在我的主用户输入,因此用户可以登录3x其他状态将从OPEN更改为LOCK

john

的3次尝试后的示例

之前:

  
    

OPEN:鲍勃:askmehere:

         

OPEN:约翰:askmethere:

         

LOCK:抢:robmypurse:

  

后:

  
    

OPEN:鲍勃:askmehere:

         

LOCK:约翰:askmethere:

         

LOCK:抢: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;
}

2 个答案:

答案 0 :(得分:10)

有两种常用方法可以替换或修改文件。第一种和“经典”方式是逐行读取文件,检查需要修改的行,并写入临时文件。当您到达输入文件的末尾时,将其关闭,并将临时文件重命名为输入文件。

另一种常见的方法是当文件相对较小,或者你有大量内存时,将其全部读入内存,进行所需的修改,然后将内存的内容写出到文件中。 如何将其存储在内存中可能会有所不同,例如包含文件中行的向量,或包含文件中所有字符而不分离的向量(或其他缓冲区)。

您的实现存在缺陷,因为您在循环内打开输出文件(与输入文件相同)。第一个问题是操作系统可能不允许您打开文件进行写入,如果您已经打开它进行读取,并且因为您没有检查打开文件的失败,您将不会知道这一点。另一个问题是,如果操作系统允许,那么您对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';

答案 1 :(得分:0)

使用ReadLine并找到您要替换的行,并使用replace替换您想要替换的内容。例如写:

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

OR

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

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