Поиск в файле .txt в Windows Forms

Необходимо на С++/CLI в Windows Forms организовать работу с файлом txt.
Файл состоит из фамилий сотрудников, их инициалов и номеров телефонов.

Задание:

  1. ввести в textBox1 название файла.
  2. по нажатию кнопки в textBox2 вывести его содержимое.
  3. в textBox3 ввести фамилию и инициалы сотрудника.
  4. по нажатию второй кнопки в textBox4 вывести номер телефона

У меня есть готовый рабочий код в консоли, но переписать его в форму никак не выходит.

Вот код для консоли:

#include <iostream>
#include <fstream>
#include <string>
using namespace std;
int main()
{
    setlocale(LC_CTYPE, "Russian");
    ifstream f("file.txt");// открываем файл 
    if (f.is_open())//если файл существует
    {
        cout << "Файл существует." << endl;
        cout << "Данные из файла:" << endl;
        ifstream file("file.txt");
        string s;
        while (getline(file, s))//пока есть строки
        {
            cout << s << endl; //выводим строки
        }
        file.close();//закрываем файл после чтения    
        while (true)
        {
            string name;//строка с ФИО
            string first, last;//переменная для фамилии и инициалов
            string number;//номер телефона
            int result = 0;//переменная для остановки цикла
            cout << "Введите фамилию и инициалы: ";
            getline(cin, name);//ввод ФИО
            while (f >> first >> last >> number)//пока есть строки
                //разбиваем строку на части: фамилия, инициалы и номер телефона
                if (first + ' ' + last == name)//если фамилия и инициалы совпадают с веденным именем
                {
                    cout << "Сотрудник найден. Его номер телефона: " << number << endl << endl;
                    result = 1;//сотрудник найден
                }
           if (!result)//если сотрудник не найден
                cout << "Сотрудник не найден." << endl << endl;
            break;//остановка цикла
        }       
    }
    else //если файл не найден
        cout << "Файла не существует." << endl;
    system("pause");
    return 0;
}

Вот содержимое файла:

Ivanov S.E. +123453424234
Petrov A.A. +565654656565
Sidorov I.V. +245646257507
Kalinina E.V. +145672308792
Andreev S.O. +980542178903
Tarasenko V.A. +765421038954

У меня получилось вывести содержимое файла в textBox, а поиск реализовать не могу... Кнопка для вывода данных в файле:

private: System::Void button1_Click(System::Object^ sender, System::EventArgs^ e) {
    String^ filename = Convert::ToString(this->textBox1->Text);
    if (File::Exists(filename))
    {
        String^ fileText = File::ReadAllText(filename);
        textBox2->Text = fileText;
    }
    else this->textBox1->Text = "Файла не существует";
}

Кнопка для поиска:

private: System::Void button2_Click(System::Object^ sender, System::EventArgs^ e) {

    while (true)
    {
        String^ name = Convert::ToString(this->textBox3->Text);;//строка с ФИО
        String ^first, ^last, ^ number;
        int result = 0;//переменная для остановки цикла
        //тут уже не знаю, как реализовать поиск
        //while (f >> first >> last >> number)//пока есть строки
            //разбиваем строку на части: фамилия, инициалы и номер телефона
            //if (first + ' ' + last == name)//если фамилия и инициалы совпадают с веденным именем
            //{
            //  this->textBox4->Text = number;
            //  result = 1;//сотрудник найден
            //}
        //if (!result)//если сотрудник не найден
        //  this->textBox4->Text = "Сотрудник не найден.";
        break;//остановка цикла
    }

}


Ответы (1 шт):

Автор решения: Alexander Petrov

Следующий код осуществляет поиск сотрудника и если он найден, выводит номер телефона.

Сперва текст разбивается на строки с помощью метода String->Split.
В цикле проходим по этим строкам. Каждую из них разбиваем на подстроки по символу '+'.
Далее сравниваем введённое пользователем имя с первым элементом массива. Во втором элементе будет номер телефона.
Если сотрудник найден, то цикл прерываем с помощью return и выходим из метода.

private: System::Void button2_Click(System::Object^  sender, System::EventArgs^  e) {
    
    String^ name = this->textBox3->Text->Trim();

    array<String^> ^ lineSeparator = { Environment::NewLine };
    auto lines = this->textBox2->Text->Split(
        lineSeparator, StringSplitOptions::RemoveEmptyEntries);

    char valueSeparator = '+';
    for each (String^ line in lines)
    {
        auto values = line->Split(valueSeparator);

        if (values[0]->Trim() == name) {
            this->textBox4->Text = values[1];
            return;
        }
    }
    this->textBox4->Text = "Сотрудник не найден";
}

Методом Trim() я убираю лишние пробелы, которые остаются после расщепления строк и которые могут быть введены пользователем. Это упрощает сравнение строк и поиск.

Не давайте переменным названия наподобие textBox1, button2. Дайте им говорящие имена: textBoxFileName, buttonSearch и т. п.

→ Ссылка