我只是想知道我在 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;
}
答案 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");
}