Форум программистов, компьютерный форум, киберфорум
C++/CLI
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.56/9: Рейтинг темы: голосов - 9, средняя оценка - 4.56
1 / 1 / 0
Регистрация: 12.03.2013
Сообщений: 44

Работа с файлом и текстом

28.06.2015, 18:09. Показов 2049. Ответов 16
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Работаю с формами впервые. Возник такой вопрос.
У меня есть файл, который содержит следующую информацию:

время 0.003000
КС 0xA27 КК->ОУ адрес=1 подадрес=17 слов=7
0xA27 0x4CD5 0x10 0x0 0x0 0x0 0x0 0x3FEA 0x0 0x0 0x0 0x0
0x0 0x0 0x0 0x0 0x0 0x0 0x0 0x0 0x0 0x0 0x0 0x0
0x0 0x0 0x0 0x0 0x0 0x0 0x0 0x0 0x0 0x0 0x0 0x0

время 0.004000
КС 0xE4C ОУ->КК адрес=1 подадрес=18 слов=12
0xE4C 0x4CD5 0x10 0x0 0x0 0x0 0x0 0x3FEA 0x0 0x0 0x0 0x0
0x0 0x0 0x0 0x0 0x0 0x0 0x0 0x0 0x0 0x0 0x0 0x0
0x0 0x0 0x0 0x0 0x0 0x0 0x0 0x0 0x0 0x0 0x0 0x0


...... и тд.

я считываю файл с помощью openFileDialog, затем мне нужно каждое число при КС записать в ComboBox Tasks. Как это сделать?
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
28.06.2015, 18:09
Ответы с готовыми решениями:

GUI Работа с текстовым файлом, лог файлом не мешая системе
Хочу написать прогу которая будет по таймеру искать в тхт - лог файле сообщение об ошибке. Например Error: 100 Qt C++ gui изучаю недавно...

Синий экран смерти с постоянными новыми текстом и ошибками но с одним файлом ntoskrnl.exe
Здравствуйте! Я тут новенький и мне нужна помощь :cry: Вообщем решил проопгрейдить комп заказал у моего компьютерщика 8 гигов оперативки...

Работа с файлом (корректный код, некорректная работа программы)
Для записи и чтения файла использую разные функции. По одиночке они работают нормально. Вставляю их прототипы в функцию main() и нижняя...

16
 Аватар для SherHun
31 / 31 / 22
Регистрация: 22.06.2015
Сообщений: 102
28.06.2015, 19:23
Лучший ответ Сообщение было отмечено Militer как решение

Решение

Взять строку файла, проверить есть ли в ней подстрока "КС".
Если есть, разбить на слова, второе слово добавить в комбобокс.

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
    System::IO::StreamReader^ reader = gcnew System::IO::StreamReader(fileName);
        
            String^ line;
            while ((line = reader->ReadLine()) != nullptr)
            {
                if (line->Contains(L"КС"))
                {
                    String^ secondWord = (line->Split(gcnew array<Char> { ' ', '\t' },
                        StringSplitOptions::RemoveEmptyEntries))[1];
                    comboBox1->Items->Add(secondWord);
                }
            }
            delete  reader;
1
1 / 1 / 0
Регистрация: 12.03.2013
Сообщений: 44
28.06.2015, 20:09  [ТС]
Можешь вот это пояснить?
C++
1
2
myString->Split(gcnew array<Char> { ' ', '\t' },
StringSplitOptions::RemoveEmptyEntries))[1];
0
 Аватар для SherHun
31 / 31 / 22
Регистрация: 22.06.2015
Сообщений: 102
28.06.2015, 20:17
У класса String есть метод Split. Он разбивает строку на подстроки по разделителям,
возвращает массив подстрок.
gcnew array<Char> { ' ', '\t' } - это массив разделителей.
StringSplitOptions::RemoveEmptyEntries - что-бы удалить пустые строки, переносы,
то что лишнее.
[1] - у нас массив подстрок, значит получим второй элемент массива.


https://msdn.microsoft.com/ru-... .110).aspx
вот здесь посмотри, если не понятно.
1
1 / 1 / 0
Регистрация: 12.03.2013
Сообщений: 44
28.06.2015, 21:38  [ТС]
А как сделать чтобы при выборе КС в ComboBox выдовало всю информацию?

время 0.004000
КС 0xE4C ОУ->КК адрес=1 подадрес=18 слов=12
0xE4C 0x4CD5 0x10 0x0 0x0 0x0 0x0 0x3FEA 0x0 0x0 0x0 0x0
0x0 0x0 0x0 0x0 0x0 0x0 0x0 0x0 0x0 0x0 0x0 0x0
0x0 0x0 0x0 0x0 0x0 0x0 0x0 0x0 0x0 0x0 0x0 0x0
0
 Аватар для SherHun
31 / 31 / 22
Регистрация: 22.06.2015
Сообщений: 102
28.06.2015, 22:29
Лучший ответ Сообщение было отмечено tezaurismosis как решение

Решение

Файл загрузить в словарь Dictionary
где ключ будет КС , а информация будет значением

словарь
C++
1
static  System::Collections::Generic::Dictionary<String^, String^>^ dict = gcnew System::Collections::Generic::Dictionary<String^, String^>();
загрузка файла
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
    
        
            System::IO::StreamReader^ reader = gcnew System::IO::StreamReader(fileName);
        
            String^ line;
            String^ secondWord;
            System::Text::StringBuilder^ builder = gcnew System::Text::StringBuilder(256);
            dict->Clear();
            while (true)
            {
            
                line = reader->ReadLine();
                if (String::IsNullOrEmpty(line))
                {
                    dict->Add(secondWord, builder->ToString());
                    builder->Clear();
 
                }
                else
                    builder->AppendLine(line + "\r\n");
                    if (line == nullptr)
                    {
                        break;
                    }
                
                    if (line->Contains(L"КС"))
                    {
                        secondWord = (line->Split(gcnew array < Char > { ' ', '\t' },
                            StringSplitOptions::RemoveEmptyEntries))[1];
                        comboBox1->Items->Add(secondWord);
                    }
                
            }
            delete  reader;
выбор в комбобокс
C++
1
2
3
4
5
6
7
8
9
10
11
12
private: System::Void comboBox1_SelectedIndexChanged(System::Object^  sender, System::EventArgs^  e)
{
    if (comboBox1->Items->Count > 0)
    {
        String^ value = "";
        if (dict->TryGetValue(comboBox1->GetItemText(comboBox1->SelectedItem), value))
        {
            textBox1->Text = value;
        }
        
    }
}
Поправил , лишнее убрал.
1
1 / 1 / 0
Регистрация: 12.03.2013
Сообщений: 44
29.06.2015, 03:56  [ТС]
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
private: System::Void openToolStripMenuItem_Click(System::Object^  sender, System::EventArgs^  e) {
                 if(openFileDialog1->ShowDialog()==System::Windows::Forms::DialogResult::OK)
                 {
                     String^ f_name=openFileDialog1->FileName;
                     String^ secondWord;
                     String^ myString;
                     System::Text::StringBuilder^ builder = gcnew System::Text::StringBuilder(256);
                     auto myReader = gcnew IO::StreamReader(openFileDialog1->FileName, System::Text::Encoding::GetEncoding(1251));
                     dict->Clear();
                     while (true)
                     {
 
                         myString = myReader->ReadLine();
                         if (String::IsNullOrEmpty(myString))
                         {
                             dict->Add(secondWord, builder->ToString());
                             builder->Clear();
 
                         }
                         else
                             builder->AppendLine(myString + "\r\n");
                         if (myString == nullptr)
                         {
                             break;
                         }
 
                         if (myString->Contains(L"КС"))
                         {
                             secondWord = (myString->Split(gcnew array < Char > { ' ', '\t' },
                                 StringSplitOptions::RemoveEmptyEntries))[1];
                             comboBox1->Items->Add(secondWord);
                         }
 
                     }
                     myReader->Close();
                     
                 }
             }
private: System::Void comboBox1_SelectedIndexChanged(System::Object^  sender, System::EventArgs^  e) {
             if (comboBox1->Items->Count > 0)
             {
                 String^ value = "";
                 if (dict->TryGetValue(comboBox1->GetItemText(comboBox1->SelectedItem), value))
                 {
                     textBox1->Text = value;
                 }
 
             }
         }
};
}
На 16 строку ругается. Пишет ArgumentException was unhandled.An item with the same key has already been added.

Добавлено через 13 минут
Поставил try catch и все заработало
0
 Аватар для SherHun
31 / 31 / 22
Регистрация: 22.06.2015
Сообщений: 102
29.06.2015, 11:07
Значит ключи ( .. эти 0xE4C )
в файле не уникальны .
Словарь заменить на
C++
1
List<Tuple<String^, String^>^>^ list = gcnew List<Tuple<String^, String^>>();
Ключ повторяется, значит в текстбокс добавлять всю имеющуюся
по нему информацию.


А.. нет. Наверное так. Там в файле пустые строки сначала идут.
А ключи не повторяются. В общем, лучше оставить как есть.
1
1 / 1 / 0
Регистрация: 12.03.2013
Сообщений: 44
29.06.2015, 17:04  [ТС]
А как пустые строки между строками в текстбоксе убрать?
0
1 / 1 / 0
Регистрация: 12.03.2013
Сообщений: 44
06.07.2015, 18:55  [ТС]
Мне нужно чтобы повторяющиеся КС не выводились, а только подсчитывались. Почему не работает вот так?
C++
1
2
3
4
5
if(dict->ContainsKey(secondWord))
                                 {
                                     dict->Add(secondWord, builder->ToString());
                                     // }
                                 }
0
 Аватар для SherHun
31 / 31 / 22
Регистрация: 22.06.2015
Сообщений: 102
06.07.2015, 19:36
Наверно так
C++
1
2
3
4
// если такого ключа еще нет
if( ! dict->ContainsKey(secondWord))    
// то добавить  
           dict->Add(secondWord, builder->ToString());
только куда их подсчитывать?
0
1 / 1 / 0
Регистрация: 12.03.2013
Сообщений: 44
06.07.2015, 19:42  [ТС]
Так тоже не работает, все подряд выдает. В текстбокс.
0
1 / 1 / 0
Регистрация: 12.03.2013
Сообщений: 44
08.07.2015, 07:04  [ТС]
Разобрался. Еще вопрос возник. Как в текстбокс вывести не все содержимое, а только вот это

время 0.003000
КС 0xA27 КК->ОУ адрес=1 подадрес=17 слов=7
0xA27 0x4CD5 0x10 0x0 0x0 0x0 0x0 0x3FEA 0x0 0x0 0x0 0x0
0x0 0x0 0x0 0x0 0x0 0x0 0x0 0x0 0x0 0x0 0x0 0x0
0x0 0x0 0x0 0x0 0x0 0x0 0x0 0x0 0x0 0x0 0x0 0x0

Добавлено через 27 минут
Так не работает
C++
1
2
3
4
5
6
7
String^ value = "";
                 if (dict->TryGetValue(comboBox1->GetItemText(comboBox1->SelectedItem), value))
                 {
                     value = (value->Split(gcnew array < Char > { '/n' },
                         StringSplitOptions::RemoveEmptyEntries))[1];
                     textBox1->Text = value;
                 }
0
 Аватар для SherHun
31 / 31 / 22
Регистрация: 22.06.2015
Сообщений: 102
08.07.2015, 16:22
косая черта
Цитата Сообщение от Militer Посмотреть сообщение
'/n'
'\n'
1
1 / 1 / 0
Регистрация: 12.03.2013
Сообщений: 44
10.07.2015, 17:43  [ТС]
Да. Разобрался =)

Добавлено через 1 час 56 минут
Теперь не могу понять как посчитать сколько раз встретилось КС, выбранное в комбобоксе, в файле. Нужно в текстбокс вывести. Не подскажите как это сделать?
время 0.003000
КС 0xA27 КК->ОУ адрес=1 подадрес=17 слов=7
0xA27 0x4CD5 0x10 0x0 0x0 0x0 0x0 0x3FEA 0x0 0x0 0x0 0x0
0x0 0x0 0x0 0x0 0x0 0x0 0x0 0x0 0x0 0x0 0x0 0x0
0x0 0x0 0x0 0x0 0x0 0x0 0x0 0x0 0x0 0x0 0x0 0x0

Добавлено через 23 минуты
Сделал вот так. Может можно красивее?
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
if (comboBox1->Items->Count > 0)
             {
                 String^ secondWord;
                 System::Text::StringBuilder^ builder = gcnew System::Text::StringBuilder(256);
                 auto myReader = gcnew IO::StreamReader(openFileDialog1->FileName, System::Text::Encoding::GetEncoding(1251));
                 String^ value = "";
                 String^ myString;
                 int i=0;
                 while (true)
                 {
                     myString = myReader->ReadLine();
                     if (String::IsNullOrEmpty(myString))
                     {
                         try
                         {
                             dict->Add(secondWord, builder->ToString());
                         }
 
                         catch (ArgumentException^)
                         {
 
                         }
 
                         builder->Clear();
 
                     }
                     else
                         builder->AppendLine(myString);
                     if (myString == nullptr)
                     {
                         break;
                     }
                     myString = myReader->ReadLine();
                     if (myString->Contains(L"КС"))
                     {
                         secondWord = (myString->Split(gcnew array < Char > { ' ', '\t' },
                             StringSplitOptions::RemoveEmptyEntries))[1];
                         if(!String::Compare(secondWord,comboBox1->GetItemText(comboBox1->SelectedItem)))
                         {
                             i++;
                         }
                     }
 
                 }
                 myReader->Close();
                 if (dict->TryGetValue(comboBox1->GetItemText(comboBox1->SelectedItem), value))
                 {
                     value = (value->Split(gcnew array < Char > {'\n'}))[1];
                     textBox1->Text = value+"\n"+"\nКС встречается "+Convert::ToString(i)+" раз.";
                 }
 
             }
         }
0
Администратор
Эксперт .NET
 Аватар для tezaurismosis
9673 / 4825 / 763
Регистрация: 17.04.2012
Сообщений: 9,664
Записей в блоге: 14
11.07.2015, 16:07
Слишком в тему не вчитывался, но
Цитата Сообщение от Militer Посмотреть сообщение
C++
1
2
3
4
5
6
7
try
{
    dict->Add(secondWord, builder->ToString());
}
catch (ArgumentException^)
{
}
Это вы так проверяете secondWord на пустоту?
Тогда
C++
1
2
3
// Если нужно проверить ещё на пустую строку, то String::IsNullOrEmpty()
if (secondWord != nullptr)
    dict->Add(secondWord, builder->ToString());
0
1 / 1 / 0
Регистрация: 12.03.2013
Сообщений: 44
14.08.2015, 11:11  [ТС]
Еще вопросик возник. Мне нужно сохранить в файл все выбранные КС(с одинаковым номером), но сохраняет только одно, в чем проблема?
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
System::Void сохранитьToolStripMenuItem_Click(System::Object^  sender, System::EventArgs^  e) {
             if(saveFileDialog1->ShowDialog() == System::Windows::Forms::DialogResult::OK)
             {   
                 if (comboBox1->Items->Count > 0)
             {
                 String^ secondWord;
                 System::Text::StringBuilder^ builder = gcnew System::Text::StringBuilder(256);
                 auto myReader = gcnew IO::StreamReader(openFileDialog1->FileName, System::Text::Encoding::GetEncoding(1251));
                 String^ value = "";
                 String^ myString;
                 int i=0;
                 while (true)
                 {
                     myString = myReader->ReadLine();
                     if (String::IsNullOrEmpty(myString))
                     {
                         try
                         {
                             dict->Add(secondWord, builder->ToString());
                         }
 
                         catch (ArgumentException^)
                         {
 
                         }
 
                         builder->Clear();
 
                     }
                     else
                         builder->AppendLine(myString);
                     if (myString == nullptr)
                     {
                         break;
                     }
                     myString = myReader->ReadLine();
                     if (myString->Contains(L"КС"))
                     {
                         if(!String::Compare(secondWord,comboBox1->GetItemText(comboBox1->SelectedItem)))
                         {
                            secondWord =secondWord + (myString->Split(gcnew array < Char > { '\n' },
                            StringSplitOptions::RemoveEmptyEntries))[1];
                         }
                     }
 
                 }
                 myReader->Close();
                // if (dict->TryGetValue(comboBox1->GetItemText(comboBox1->SelectedItem), value))
                 //{
                     //value = (value->Split(gcnew array < Char > {'\n'}))[1];
                     IO::File::WriteAllText(saveFileDialog1->FileName,secondWord);
                 //}
             }
                 //IO::File::WriteAllText(saveFileDialog1->FileName,textBox1->Text);
             }
         }
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
14.08.2015, 11:11
Помогаю со студенческими работами здесь

Работа с текстом
Помогите, пожалуйста, в решении вот такой вот задачи: Необходимо выводить на экран только слово с указанным номером из введенного текста...

Работа с текстом...
Всем доброго времени суток ... Такая ситуация - загружаю через диалог в RichEdit1 - определённый текстовик с текстом. Вопрос: как сделать...

Заданный текст распечатать по строкам
Помогите пожалуйста очень прошу!!! Заданный текст распечатайте по строкам, понимая под строкой либо очередные 20 литер, если среди них...

Работа с текстом
Есть файл db.php в нем такой текст Name|ID Name2|ID Name3|ID3 На сервер идет запрос с Name, а в ответ должен придти айди)...

Работа с текстом
Всем привет! Помогите, пожалуйста, написать следующую программу: Программа с помощью прочитанного файла должна каждой букве русского...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
17
Ответ Создать тему
Новые блоги и статьи
Подключение Box2D v3 к SDL3 для Android: физика и отрисовка коллайдеров
8Observer8 29.01.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами. Версия v3 была полностью переписана на Си, в. . .
Инструменты COM: Сохранение данный из VARIANT в файл и загрузка из файла в VARIANT
bedvit 28.01.2026
Сохранение базовых типов COM и массивов (одномерных или двухмерных) любой вложенности (деревья) в файл, с возможностью выбора алгоритмов сжатия и шифрования. Часть библиотеки BedvitCOM Использованы. . .
Загрузка PNG с альфа-каналом на SDL3 для Android: с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 28.01.2026
Содержание блога SDL3 имеет собственные средства для загрузки и отображения PNG-файлов с альфа-каналом и базовой работы с ними. В этой инструкции используется функция SDL_LoadPNG(), которая. . .
Загрузка PNG с альфа-каналом на SDL3 для Android: с помощью SDL3_image
8Observer8 27.01.2026
Содержание блога SDL3_image - это библиотека для загрузки и работы с изображениями. Эта пошаговая инструкция покажет, как загрузить и вывести на экран смартфона картинку с альфа-каналом, то есть с. . .
Влияние грибов на сукцессию
anaschu 26.01.2026
Бифуркационные изменения массы гриба происходят тогда, когда мы уменьшаем массу компоста в 10 раз, а скорость прироста биомассы уменьшаем в три раза. Скорость прироста биомассы может уменьшаться за. . .
Воспроизведение звукового файла с помощью SDL3_mixer при касании экрана Android
8Observer8 26.01.2026
Содержание блога SDL3_mixer - это библиотека я для воспроизведения аудио. В отличие от инструкции по добавлению текста код по проигрыванию звука уже содержится в шаблоне примера. Нужно только. . .
Установка Android SDK, NDK, JDK, CMake и т.д.
8Observer8 25.01.2026
Содержание блога Перейдите по ссылке: https:/ / developer. android. com/ studio и в самом низу страницы кликните по архиву "commandlinetools-win-xxxxxx_latest. zip" Извлеките архив и вы увидите. . .
Вывод текста со шрифтом TTF на Android с помощью библиотеки SDL3_ttf
8Observer8 25.01.2026
Содержание блога Если у вас не установлены Android SDK, NDK, JDK, и т. д. то сделайте это по следующей инструкции: Установка Android SDK, NDK, JDK, CMake и т. д. Сборка примера Скачайте. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru