我想替換特定行的一部分。我以為我可以:
- 找到線
- 將此行指定為臨時行(如 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
uj5u.com熱心網友回復:
考慮一下您是否想要一個快速而骯臟的解決方案,或者一個適用于任何型別資料的可重用解決方案。
我會選擇第二個選項,將代碼拆分為子問題:
- 如果少于 1000000 行,則將檔案讀入記憶體。
- 解碼標題,我有哪些列以及每個列的寬度
- 解碼檔案的其余部分,每一行的語法是否正確?使用標題行的語法。也許為此找到一個正則運算式庫(regex)以避免困難的空格/制表符,大寫/小寫。
- 對資料運行您的查詢,替換您想要的任何內容。
- 將資料寫回(相同)檔案。僅當至少更改一項時。
uj5u.com熱心網友回復:
我想建議的是一個通常應該避免的骯臟伎倆。只有當您的檔案非常大時,才值得一看。但是這個技巧有一個先決條件:
檔案中所有行的長度應該相似,這意味著您可能需要用額外的空格填充每一行以達到前綴大小。另外,線的每一部分都需要有一個最大的固定尺寸。
因此,讓我們假設您已將檔案行設計為 80 個字符,如下所示:
|---- 25 chars ----||---- 25 chars ----||-- 10 --||-- 10 --||-- 10 --|
Leon Schmidt santrafor 31 55 88 \n
但是如果你有一個這樣的檔案,你可以手動計算每行的起始位元組數。因此,如果您想更改第 10 行,起始位元組將是(10 2)*80=960(為 2 行標題添加 2 個)。然后,您可以將檔案作為binary打開,使用 轉到第 960 個位元組fseek(),并在該行中更新 80 個位元組。在這種情況下,您可以以最小的開銷更改檔案。
但正如我所說,這是一個骯臟的把戲,除非完全有必要,否則應該避免。
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/394771.html
標籤:C
