如何修改TStringList中字符串的单个字符?为何直接修改不生效?
为什么直接修改TStringList的字符串字符不生效?
你遇到的问题本质是TStringList::Strings属性的工作机制导致的,先看你的代码示例:
void __fastcall TForm1::Button1Click(TObject *Sender) { TStringList *Lista = new TStringList; if(OpenDialog1->Execute()) Lista->LoadFromFile(OpenDialog1->FileName); Lista->Strings[0][1] = '0'; // 此代码不生效 // 只有这种方式有效 String A = Lista->Strings[0]; A[1] = '0'; Lista->Strings[0] = A; }
原因说明
Strings是TStringList的属性,不是直接的字符串数组。当你用Lista->Strings[0]读取内容时,返回的是当前行字符串的临时副本,而非指向TStringList内部存储的原字符串的引用。- 你修改
Lista->Strings[0][1]时,实际是在修改这个临时副本的字符,修改完成后这个临时对象就会被销毁,TStringList内部存储的原字符串完全没被改动,自然写回文件时看不到变化。 - 而先将
Strings[0]赋值给独立的String A,修改A的字符后再通过Lista->Strings[0] = A赋值回去,这会调用属性的set方法,把修改后的字符串真正写入TStringList的内部存储,这样修改才会被保存。
总结
要修改TStringList中的行内容,必须通过属性的setter完成更新,直接操作getter返回的临时对象无法修改原数据。
内容的提问来源于stack exchange,提问作者Jacek
相关产品推荐
相关产品推荐

