gpt4 book ai didi

c++ - 替换文件中间的文本

转载 作者:太空宇宙 更新时间:2023-11-04 13:14:40 25 4
gpt4 key购买 nike

我有 .txt 文件,其中有几行:

username1:123456789:etc:etc:etc:etc
username2:1234:etc:etc:etc:etc
username3:123456:etc:etc:etc:etc
username4:1234567:etc:etc:etc:etc

用户名1 - 用户名;123456789 - 密码;等 - 更多文字。

我有代码来读取文件并找到 username 我需要的行。也可以更改密码,但是如果新密码比旧密码长那么就会出现问题:

username3:11111111111tc:etc:etc:etc

如果新密码更短,则看起来像:

username1:111111789:etc:etc:etc:etc

我有新密码的长度,但我怎样才能得到旧密码的长度并正确替换它?

我的代码

include<iostream>
#include<fstream>
#include <cstring>

using namespace std;

int main() {
int i=0;
bool found = false;
string line, username;
char newpass[255] = "555555555555555";
long length, plen;


cout<<"Insert username: ";
cin>>username;
username+=":";
fstream changeLINE("/.../testaDoc.txt");

if (!changeLINE) {
cout << "Can't find the file or directory!" << endl;
}
else

while (getline(changeLINE, line) && !found) {
i++;

if (line.find(username) != string::npos) {
length = changeLINE.tellg();
changeLINE.seekg((length - line.length()) + username.length() - 1);
changeLINE.write("", strlen(newpass));
cout << line << " line " << i << endl;
found = true;
}
}

if (!found)
cout << "User with username = " << username << " NOT FOUND!";

changeLINE.close();

}

我在 Linux 上工作,用 C++ 编写。

编辑

也许有办法在文本中添加字符串,但不能替换它,也有办法通过不替换来删除字符串?然后我可以读取旧密码的长度,将其与新密码进行比较,并删除/添加字符串中的字母以正确替换它。

最佳答案

除非你想替换的线和新线的长度一样,否则你需要不同的策略-

这是您可以使用的策略:

  • 创建临时文件
  • 将您不想更改的行直接写入临时文件。你要改的那行,你换成新的行
  • 关闭两个文件。
  • 删除原文件
  • 将临时文件重命名为原来的文件名

或者您可以像评论中提到的那样将所有行读入内存,例如一个行 vector ,替换你想要更改的行,然后将所有行写回文件,替换以前的内容。如果新行比前一行短,您可以截断文件,例如:How to truncate a file while it is open with fstream

这行得通吗:

std::vector<std::string> lines;
while (std::getline(changeLINE, line))
{
i++;

if (line.find(username) != std::string::npos) {
std::cout << line << " line " << i << std::endl;
found = true;
std::string newline = username + ":" + newpass + line.substr(line.find(":", username.length() + 2)) ;
lines.push_back(newline);
}
else
{
lines.push_back(line);
}
}

changeLINE.close();
std::ofstream ofs;
ofs.open("/.../testaDoc.txt", std::ofstream::out | std::ofstream::trunc);

for(auto& s: lines)
ofs << s << std::endl;

ofs.close();

关于c++ - 替换文件中间的文本,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37922435/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com