我想替换特定行的一部分。我想我可以:
- 查找行
- 为该行指定一个临时行(如target_line(
- 把我想要的零件换成临时线
- 删除原始行并重写文本文件中的临时行
我的一行包含:球员的姓名、姓氏、职位、年龄、表现和球衣号码。我想把";执行";如果用户愿意,则为数字。
所以我写了这个代码:
void TeamSetFuncChangePerform(string nickname, int jersey) {
ifstream readForChanging;
readForChanging.open("formedteam.txt", ios::app);
string target_team = nickname;
int target_player = jersey;
int jerseyno;
string line;
size_t isFound{};
string target_line;
string perform;
int answer;
if (readForChanging.is_open()) {
while (!(readForChanging.eof())) {
getline(readForChanging, line);
isFound = (line.find(target_team));
if (isFound != string::npos) {
isFound = 1;
break;
}
else {
isFound = 0;
}
}
我用上面的代码在文件中找到了目标球队,我试图用下面的代码找到目标球员:
if (isFound == 1) {
for (int i = 0; i < 11; i++) {
getline(readForChanging, line);
isFound = (line.find(target_player));
if (isFound != string::npos) {
target_line = line;
cout << "enter performans value between 30-100";
cin >> perform;
target_line[61] = perform[0];
target_line[62] = perform[1];
cout << "changed the performance value of player #" << target_player << endl;
如果找到了目标玩家;执行";价值现在我必须更换新的";执行";价值与旧的。我也搜索了replace()
方法,但我不明白如何使用replace()
。所以,问题是如何更改特定的子字符串并将其重写到文件中?
这是我的文本文件的一个示例。例如,我该如何改变Benjamin Blanchet的";执行";用新的价值?
name surname position age perform jersey no
team: tr-trabzonspor
Leon Schmidt santrafor 31 55 88
Leon Schmidt kanat forvet 32 81 96
Robin Perez kanat forvet 29 40 2
Robin Perez ofansif ortasaha 20 69 68
Howl Pendragon ofansif ortasaha 27 95 57
Benjamin Blanchet ortasaha 19 78 54
Yves Russo ortasaha 24 87 40
Robin Perez sagbek 23 79 4
Hans Weber solbek 36 57 89
Hans Weber defans 18 43 21
William Dupont kaleci 35 83 83
考虑一下您是否想要快速&肮脏的解决方案,或对任何类型的数据都有效的可重复使用的解决方案。
我会选择第二个选项,将代码拆分为子问题:
- 如果少于1000000行,请将文件读入内存
- 解码标题,我有哪些列,每列的宽度是多少
- 解码文件的其余部分,每一行都有正确的语法吗?使用标题行的语法。也许可以为此找到一个正则表达式库(regex(,以避免出现困难的空格/制表符、大写/小写
- 对数据运行查询,替换所需内容
- 将数据写回(同一(文件。只有在至少更改一个的情况下
我想建议的是一个通常应该避免的肮脏技巧只有当你的文件真的很大时,才值得一看。但这个技巧有一个先决条件:
文件中所有行的长度应该相似,这意味着您可能需要在每行中添加额外的空格以达到前缀大小。此外,线路的每个部分都需要有一个最大固定尺寸
因此,假设您已经将文件行设计为80个字符,如下所示:
|---- 25 chars ----||---- 25 chars ----||-- 10 --||-- 10 --||-- 10 --|
Leon Schmidt santrafor 31 55 88 n
但如果您有这样的文件,您可以手动计算每行的起始字节数。因此,如果您想更改第10行,起始字节将是(10+2)*80=960
(为2行标头添加2个字节(。然后,您可以将文件打开为binary,使用fseek()
转到第960个字节,并更新该行中的80个字节。在这种情况下,您可以以最小的开销更改文件。
但正如我所说,这是一个肮脏的把戏,除非完全必要,否则应该避免。