File io 编辑文件内容

File io 编辑文件内容,file-io,textbox,c++-cli,editing,overwrite,File Io,Textbox,C++ Cli,Editing,Overwrite,在表格1中,我有两个文本框(姓氏和姓名)。当我按下“注册”按钮时,我通过TextWriter将它们写入一个文件。每行包含姓氏和姓名,因此每行有2个字段 在Form2中,我想通过询问一个参数来编辑它们。例如,在Form2中,我有一个文本框。如果我在文本框中输入的姓氏等于我文件中的姓氏,我希望在Form1中的正确文本框中显示姓氏和姓名,编辑姓氏或姓名后,我希望通过按下“注册”按钮在正确位置覆盖前一行 感谢用户Medinoc,我编写了如下文件: ref class MyClass { public:

在表格1中,我有两个文本框(姓氏和姓名)。当我按下“注册”按钮时,我通过TextWriter将它们写入一个文件。每行包含姓氏和姓名,因此每行有2个字段

在Form2中,我想通过询问一个参数来编辑它们。例如,在Form2中,我有一个文本框。如果我在文本框中输入的姓氏等于我文件中的姓氏,我希望在Form1中的正确文本框中显示姓氏和姓名,编辑姓氏或姓名后,我希望通过按下“注册”按钮在正确位置覆盖前一行

感谢用户Medinoc,我编写了如下文件:

ref class MyClass
{
public:
    String^ cognome;
    String^ nome;
};

//...

List<MyClass^>^ primo = gcnew List<MyClass^>();

//...

MyClass^ myObj = gcnew MyClass();
myObj->cognome = textBox1->Text;
myObj->nome = textBox2->Text;
primo->Add(myObj);

//...

TextWriter ^tw = gcnew StreamWriter(L"primoAnno.txt", true);
for each(MyClass^ obj in primo)
{
    //You can use any character or string as separator,
    //as long as it's not supposed to appear in the strings.
    //Here, I used pipes.
    tw->Write(obj->cognome);
    tw->Write(L"|");
    tw->Write(obj->nome);
}
tw->Close();
ref class MyClass
{
公众:
字符串^cognome;
字符串^nome;
};
//...
List^primo=gcnewlist();
//...
MyClass^myObj=gcnewmyclass();
myObj->cognome=textBox1->Text;
myObj->nome=textBox2->Text;
primo->Add(myObj);
//...
TextWriter ^tw=gcnewstreamwriter(L“primoAnno.txt”,true);
对于每个(MyClass ^obj在primo中)
{
//您可以使用任何字符或字符串作为分隔符,
//只要它不应该出现在字符串中。
//这里,我用的是管子。
tw->Write(obj->cognome);
tw->Write(L“|”);
tw->写入(obj->nome);
}
tw->Close();
阅读

MyClass^ParseMyClass(字符串^line)
{
数组^splitString=line->Split(L'|');
MyClass^myObj=gcnewmyclass();
myObj->cognome=splitString[0];
myObj->nome=splitString[1];
返回myObj;
}
希望我说得够清楚。我不是英国人。
提前谢谢

这仍然是经典的文本文件编辑行为:

您需要的是一个函数来搜索文件中的特定行;和另一个修改特定行的函数。那一个将类似于

查找:

更新:

MyClass^ objToUpdate = gcnew MyClass;
objToUpdate->cognome = textBox1->Text;
objToUpdate->nome = textBox2->Text;

TextWriter^ tw = gcnew StreamWriter(L"primoAnno2.txt", true);
TextReader^ tr = gcnew StreamReader(L"primoAnno.txt");
String^ line;
bool updated = false;
while((line=tr->ReadLine()) != nullptr)
{
    MyClass^ obj = ParseMyClass(line);
    if(obj->cognome == objToUpdate->cognome)
    {
        line = objToUpdate->cognome + L"|" + objToUpdate->nome;
        updated = true;
    }
    tw->WriteLine(line);
}
//If the surname was not in the file at all, add it.
if(!updated)
{
    line = objToUpdate->cognome + L"|" + objToUpdate->nome;
    tw->WriteLine(line);
}
tr->Close();
tw->Close();
File::Delete(L"primoAnno.txt");
File::Move(L"primoAnno2.txt", L"primoAnno.txt");

我需要试试。但有一件事我不确定。从编辑表单开始,代码应该显示前面的“cognome”和“nome”在注册表的文本框中。我猜这段代码不会这样做。所以我问你如何从form2中管理form1文本框?例如//form2.cpp myproject::form1->textBox1->Text=obj->cognome?谢谢我猜这与在FileDialog中所做的方式相同:在关闭表单后公开可用的公共属性。
MyClass^ FindMyClass(String^ surnameToFind)
{
    MyClass^ found = nullptr;
    TextReader^ tr = gcnew StreamReader(L"primoAnno.txt");
    String^ line;
    while(found == nullptr && (line=tr->ReadLine()) != nullptr)
    {
        MyClass^ obj = ParseMyClass(line);
        if(obj->cognome == surnameToFind)
            found = surnameToFind;
    }
    tr->Close();
}
MyClass^ objToUpdate = gcnew MyClass;
objToUpdate->cognome = textBox1->Text;
objToUpdate->nome = textBox2->Text;

TextWriter^ tw = gcnew StreamWriter(L"primoAnno2.txt", true);
TextReader^ tr = gcnew StreamReader(L"primoAnno.txt");
String^ line;
bool updated = false;
while((line=tr->ReadLine()) != nullptr)
{
    MyClass^ obj = ParseMyClass(line);
    if(obj->cognome == objToUpdate->cognome)
    {
        line = objToUpdate->cognome + L"|" + objToUpdate->nome;
        updated = true;
    }
    tw->WriteLine(line);
}
//If the surname was not in the file at all, add it.
if(!updated)
{
    line = objToUpdate->cognome + L"|" + objToUpdate->nome;
    tw->WriteLine(line);
}
tr->Close();
tw->Close();
File::Delete(L"primoAnno.txt");
File::Move(L"primoAnno2.txt", L"primoAnno.txt");