用另一个字符串替换任何一行



我想替换特定行的一部分。我想我可以:

  1. 查找行
  2. 为该行指定一个临时行(如target_line(
  3. 把我想要的零件换成临时线
  4. 删除原始行并重写文本文件中的临时行

我的一行包含:球员的姓名、姓氏、职位、年龄、表现和球衣号码。我想把";执行";如果用户愿意,则为数字。

所以我写了这个代码:

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        

考虑一下您是否想要快速&肮脏的解决方案,或对任何类型的数据都有效的可重复使用的解决方案。

我会选择第二个选项,将代码拆分为子问题:

  1. 如果少于1000000行,请将文件读入内存
  2. 解码标题,我有哪些列,每列的宽度是多少
  3. 解码文件的其余部分,每一行都有正确的语法吗?使用标题行的语法。也许可以为此找到一个正则表达式库(regex(,以避免出现困难的空格/制表符、大写/小写
  4. 对数据运行查询,替换所需内容
  5. 将数据写回(同一(文件。只有在至少更改一个的情况下

我想建议的是一个通常应该避免的肮脏技巧只有当你的文件真的很大时,才值得一看。但这个技巧有一个先决条件:

文件中所有行的长度应该相似,这意味着您可能需要在每行中添加额外的空格以达到前缀大小。此外,线路的每个部分都需要有一个最大固定尺寸

因此,假设您已经将文件行设计为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个字节。在这种情况下,您可以以最小的开销更改文件。

但正如我所说,这是一个肮脏的把戏,除非完全必要,否则应该避免。

相关内容

最新更新