替换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");
}
我只是想知道,因为我在 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");
}