Форум программистов, компьютерный форум, киберфорум
C++ Builder
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.94/18: Рейтинг темы: голосов - 18, средняя оценка - 4.94
0 / 0 / 0
Регистрация: 10.08.2019
Сообщений: 21
Builder 6

Файл: Как загрузить в динамически создаваемый массив булевых значений информацию из текстового файла?

25.09.2019, 17:39. Показов 3703. Ответов 34
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Уважаемые форумчане!

Кто знает, как загрузить в динамически (при запуске программы) создаваемый массив булевых значений информацию из текстового файла?

Есть massive.txt, в котором прописаны через пробел значения:

0 0 1 0 0 1 0 1

и т. д.

Соответственно, там, где 0 - должно в массиве быть значение false (или тот же ноль), где 1 - значение true (или единица)

Как это реализовать при загрузке формы в событии OnCreate ?

Или, может, лучше для этой цели использовать какой-либо иной формат, как .ini или .xml ?

Буду рад любым дельным подсказкам. Спасибо.
С уважением, QuantumSH.
0
Лучшие ответы (1)
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
25.09.2019, 17:39
Ответы с готовыми решениями:

Как загрузить информацию из текстового файла в DataGridView
подскажите,как при нажатии кнопки перенести данные из текстового файла в datagridview. данные в файле отделяются символом #, столбцы...

Загрузить информацию из текстового файла в StringGrid
Проблема в том, что вся информация загружается только в первый столбец. Как сделать так,чтобы загружалось по столбцам? Ниже прилагаю...

Запись в динамически создаваемый файл
Здравствуйте. проблема такая: я создаю файл и хочу записать в него текст из др. файла: FileCreate('C:AS_web '+Edit1.Text+'...

34
 Аватар для lifeforce
266 / 211 / 89
Регистрация: 27.09.2010
Сообщений: 1,234
25.09.2019, 22:11
QuantumSH,
а что мешает при старте программы в Form загрузить файл massive.txt?
C++
1
2
3
4
5
6
__fastcall TForm1::TForm1(TComponent* Owner)  //
    : TForm(Owner)
{
Form1->LoadFromFile("massive.txt");
// и заполнить массив.
}
а в принципе нет смысла в пробелах.
00100101 и читать текст как булевый параметр.
0
 Аватар для TrollHammer
1216 / 709 / 336
Регистрация: 22.02.2018
Сообщений: 2,095
Записей в блоге: 2
26.09.2019, 01:49
Цитата Сообщение от lifeforce Посмотреть сообщение
Form1->LoadFromFile("massive.txt");
Как-то у TForm отсутствует такой метод.
1
Модератор
 Аватар для D1973
9916 / 6453 / 2455
Регистрация: 21.01.2014
Сообщений: 27,388
Записей в блоге: 3
26.09.2019, 06:02
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
#include <Memory>
#include <Vector>
...
void __fastcall TForm3::FormCreate(TObject *Sender)
{
   std::auto_ptr<TStringList> L (new TStringList);
//********************************
//Если хотите использовать свой массив где-то помимо обработчика OnCreate
//унесите это объявление в секцию private класса формы
   std::vector<bool> B;
//********************************
   L->LoadFromFile("c:\\tmp\\massiv.txt");
   L->CommaText = L->Text;
   for(int i = 0; i < L->Count; i++)
     B.push_back(StrToBool(L->Strings[i]));
}
1
0 / 0 / 0
Регистрация: 10.08.2019
Сообщений: 21
26.09.2019, 14:33  [ТС]
Давайте разбираться.

Цитата Сообщение от D1973 Посмотреть сообщение
std::auto_ptr<TStringList> L (new TStringList);
- как я понимаю, этот оператор создает строковый список L для помещения значений из файла.

Дальше идет загрузка списка из файла;
что делает этот оператор -
Цитата Сообщение от D1973 Посмотреть сообщение
L->CommaText = L->Text;
???

Наконец, происходит преобразование строк в булевые значения - формирование нового булевого списка - оператором в цикле
Цитата Сообщение от D1973 Посмотреть сообщение
for(int i = 0; i < L->Count; i++) B.push_back(StrToBool(L->Strings[i]));
Вопросы:
1) Что делает метод CommaText и
2) Как потом обратиться к конкретному значению массива по индексу? Так -

bool b = B[i] ???
0
 Аватар для TrollHammer
1216 / 709 / 336
Регистрация: 22.02.2018
Сообщений: 2,095
Записей в блоге: 2
26.09.2019, 15:06
Цитата Сообщение от QuantumSH Посмотреть сообщение
Что делает метод CommaText
Преобразует 1 строку с разделителями, загруженную из файла в StringList, в список значений
0
0 / 0 / 0
Регистрация: 10.08.2019
Сообщений: 21
26.09.2019, 15:22  [ТС]
Цитата Сообщение от TrollHammer Посмотреть сообщение
Преобразует 1 строку с разделителями, загруженную из файла в StringList, в список значений
Спасибо.
0
Модератор
 Аватар для D1973
9916 / 6453 / 2455
Регистрация: 21.01.2014
Сообщений: 27,388
Записей в блоге: 3
26.09.2019, 16:18
QuantumSH, смотрите, у Вас данные представлены одной строкой, в которой данные разделены пробелом. Когда Вы считываете содержимое файла в элемент списка TStringList - он у вас помещается в этот список так, как есть, т.е. одной строкой... Но у Ваших данных в этой строке есть четкий разделитель - пробел. Поэтому мы сначала загрузим файл в этот список строк, потом преобразуем именно к тому виду: одно значение на одной строке. Для этого и используется метод CommaText; вообще-то этот метод считает разделителями запятую (ибо "comma" - запятая), но и пробел так же учитывается, как разделитель строк. В итоге из строки "0 0 1 0 1" получим список строк вида
0
0
1
0
1
Дальше, я думаю, понятно... Проходим циклом по этому списку и переводим каждое очередное значение в булеву переменную (см. справку по функции StrToBool()), после чего записываем это булево значение в булевский массив...
После этого, да, Вы можете обратиться к любому элементу вектора (динамического массива, если Вам так проще) по его индексу, учитывая, что индексация начинается с 0... Ну и заканчивается B.Size()
0
0 / 0 / 0
Регистрация: 10.08.2019
Сообщений: 21
26.09.2019, 16:23  [ТС]
Цитата Сообщение от D1973 Посмотреть сообщение
Дальше, я думаю, понятно...
Спасибо, разобрался. Но как потом обратиться к элементу булевского массива?
Скажем, я проверяю значение элементов, и если оно истинно - исполняю какие-то действия:

C++
1
2
3
4
5
for (int i = 0; i < Count; i++)
{
     if B[i] = true // действия
     break; // нужен здесь??
}
Так что ли?))
0
Модератор
 Аватар для D1973
9916 / 6453 / 2455
Регистрация: 21.01.2014
Сообщений: 27,388
Записей в блоге: 3
26.09.2019, 17:05
Ну, даже по синтаксису у Вас конструкция неправильная...
А вот лично у меня понимания точного нет, что делать надо в случае, когда очередной элемент массива истинный и когда он ложный... В общем случае...
C++
1
2
3
4
5
6
7
8
9
for(int i = 0; i < B.Size(); i++)
  if(B[i])
    {
       // here actions, if true  
    }
  else
   {
      // here actions, if false
   }
0
0 / 0 / 0
Регистрация: 10.08.2019
Сообщений: 21
26.09.2019, 17:08  [ТС]
Спасибо большое, буду пробовать реализовывать!
0
 Аватар для lifeforce
266 / 211 / 89
Регистрация: 27.09.2010
Сообщений: 1,234
26.09.2019, 22:15

Не по теме:

Цитата Сообщение от TrollHammer Посмотреть сообщение
Как-то у TForm отсутствует такой метод.
все верно , что неправильно. ;)
копи паст так и не смог поправить. редактирование поста загружалось очень долго , плюнул , оставил как есть.
и всегда выскакивает по два раза ответ через 15 сек :D


целый вечер пытаюсь отредактировать свое сообщение
QuantumSH,
получилось реализовать?


Цитата Сообщение от D1973 Посмотреть сообщение
std::auto_ptr<TStringList> L (new TStringList);
//********************************
//Если хотите использовать свой массив где-то помимо обработчика OnCreate
//унесите это объявление в секцию private класса формы
std::vector<bool> B;
//********************************
врят ли это удастся QuantumSH с первого раза.

QuantumSH,
решение было полностью написано от D1973
0
 Аватар для lifeforce
266 / 211 / 89
Регистрация: 27.09.2010
Сообщений: 1,234
26.09.2019, 22:28
QuantumSH,
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
#include <vcl.h>
#pragma hdrstop
#include <Memory>
#include <Vector>
#include "Unit1.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
//
  std::auto_ptr<TStringList> L (new TStringList);
  std::vector<bool> B;
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
    : TForm(Owner)
{
    L->LoadFromFile("c:\\tmp\\massiv.txt");
   //ShowMessage(L->Text); // 0 0 1 0 0 1 0 1
    L->CommaText = L->Text;
   //ShowMessage(L->Text);
   //   0
   //   0
   //   1
   //   0
   //   0
   //   1
   //   0
   //   1
 
   for(int i = 0; i < L->Count; i++)
     B.push_back(StrToBool(L->Strings[i]));
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button1Click(TObject *Sender)
{
 for(int i = 0; i < B.size(); i++)
  if(B[i])
    { // here actions, if true
      Memo1->Lines->Add(String(abs((int)B[i])));//
    }
  else
   { // here actions, if false
      Memo2->Lines->Add(BoolToStr(B[i]));
   }
}
//---------------------------------------------------------------------------
Миниатюры
Файл: Как загрузить в динамически создаваемый массив булевых значений информацию из текстового файла?  
0
 Аватар для lifeforce
266 / 211 / 89
Регистрация: 27.09.2010
Сообщений: 1,234
26.09.2019, 22:28
все, я устал постоянно редактировать.
0
Модератор
 Аватар для D1973
9916 / 6453 / 2455
Регистрация: 21.01.2014
Сообщений: 27,388
Записей в блоге: 3
27.09.2019, 04:19
lifeforce, я бы не стал глобально создавать СтрингЛист... Он нужен всего на один раз: получить разбитый список для перенесения его в массив. После этого "мавр сделал свое дело, мавр может уходить"... А Вы его оставляете до тех пор, пока существует сам модуль... Самое ему место для объявления - там же, где массив формируется, в конструкторе то бишь... Отработал конструктор - удалился СтрингЛист...
0
 Аватар для lifeforce
266 / 211 / 89
Регистрация: 27.09.2010
Сообщений: 1,234
27.09.2019, 08:12
Цитата Сообщение от D1973 Посмотреть сообщение
я бы не стал глобально создавать СтрингЛист...
согласен. это быстрые наброски, и без правил
C++
1
2
3
4
5
__fastcall TForm1::TForm1(TComponent* Owner)
    : TForm(Owner)
{
    std::auto_ptr<TStringList> L (new TStringList);
    L->LoadFromFile("c:\\tmp\\massiv.txt");
0
Супер-модератор
Эксперт Pascal/DelphiАвтор FAQ
 Аватар для volvo
33377 / 21501 / 8236
Регистрация: 22.10.2011
Сообщений: 36,896
Записей в блоге: 11
27.09.2019, 12:32
Стесняюсь спросить, а средств C++ уже недостаточно? Собственно, одна строка кода:

C++
1
2
3
4
5
6
7
8
9
10
11
12
#include <fstream>
#include <vector>
#include <iterator>
#include <algorithm>
 
// ...
 
    std::ifstream file("massiv.txt");
    std::vector<bool> b;
    std::copy(std::istream_iterator<int>(file),
              std::istream_iterator<int>(),
              std::back_inserter(b));
3
 Аватар для lifeforce
266 / 211 / 89
Регистрация: 27.09.2010
Сообщений: 1,234
27.09.2019, 21:49
volvo,
не надо стеснятся
все мы здесь чтоб помогать друг другу.
мне всегда нравятся ваши решения!
только вот создатель сего поста так и не появляется.
0
0 / 0 / 0
Регистрация: 10.08.2019
Сообщений: 21
27.09.2019, 21:55  [ТС]
D1973, спасибо, ВСЕ работает.

Но то, что мне нужно, я реализовал лишь на 30%. Потому что я изначально думал загружать значения в простой булев массив, Вы же порекомендовали вектор, с которым я никогда не работал. Возможно, он лучше, но он и сложнее.

Во-первых, список (или вектор) должен быть обязательно глобальным, должен существовать во все время выполнения программы. Для чего? Ответ: программа динамически создает некие компоненты, нумеруя их (назовем их условно component1, component2 и т.д.). При загрузке программа читает значения массива, и там, где единицы, - сответственно индексам создает компоненты с индексами "единиц". Скажем, у меня 01001000110 - 11 значений; единицы стоят на 1-ом, 4-ом, 8-ом и 9-ом местах: программа создаст компоненты с номерами 1, 4, 8 и 9. Это - реализовано.

Но пользователь может в процессе выполнения программы создать иные компоненты, и тогда программа присваивает им ОСТАВШИЕСЯ номера - по порядку: component2, component3, component5 и т.д. - от 1 до 10. Это также реализовано, перебором значений того же вектора, и если находится ноль - создается компонент с соответствующим номером, значения с единицей пропускаются.
Но пользователь может и удалить некоторые из уже загруженных компонентов, и надо, чтобы значение вектора, соответствующее индексу компонента, изменилось с 1 в 0 - так в векторе как бы освобождается индекс, который опять же может быть присвоен когда-то позже созданному компоненту. КАК это реализовать? push вставляет в конец, пробовал еще at - не работает...

Теперь следующее. Надо, чтобы после закрытия программа уже не читала из файла, а записывала в файл индексы новых компонентов, так, чтобы, к примеру, запись 01001000110 изменилась соответственно новой модели программы, учитывая вновь созданные и (или) удаленные компоненты. Как обратно из вектора записать значения в текстовый файл? Следует ли повторно конвертировать значения в список StringList?

Пока все...

Добавлено через 2 минуты
Цитата Сообщение от lifeforce Посмотреть сообщение
volvo
Я попробую также Ваш вариант.
0
 Аватар для lifeforce
266 / 211 / 89
Регистрация: 27.09.2010
Сообщений: 1,234
27.09.2019, 22:35
Цитата Сообщение от QuantumSH Посмотреть сообщение
Следует ли повторно конвертировать значения в список StringList?
для сохранения в файл txt - надо.
и очень легко.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
void __fastcall TForm1::Button2Click(TObject *Sender)
{
 std::auto_ptr<TStringList> L (new TStringList);
  for(int i = 0; i < B.size(); i++)
  if(B[i])
    { // here actions, if true
      L->Add(String(abs((int)B[i])));//
    }
  else
   { // here actions, if false
      L->Add(BoolToStr(B[i]));
   }
   L->Text = StringReplace(L->Text,"\r\n"," ",TReplaceFlags() << rfReplaceAll);
   L->SaveToFile("c:\\tmp\\massiv.txt");
}
//---------------------------------------------------------------------------


[quote="QuantumSH;13858947"]
а я собственно ничего и не предлагал - если конечно это относится ко мне.
я просто озвучил решение от D1973
надеюсь хоть чем то помог к достижению решения задачи.

Не по теме:

почему всегда сообщение дублируется два раза через 15 секунд?

0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
27.09.2019, 22:35
Помогаю со студенческими работами здесь

Как считать информацию из текстового файла и записать в динамический массив?
По заданию нужно сортировать поразрядной сортировкой данные из текстовых файлов разной величины, дабы оценить скорость. Поэтому я использую...

Динамически создаваемый массив Combobox
Здравствуйте! Мне тут в программке надо принажатии кнопки создавать несколько Combobox'ов, сколько - заранее не известно. Я объявила массив...

Динамически создаваемый массив в свойствах класса
Вот так нельзя же делать? , вопрос почему? class A { public static $path = ; }

Как загрузить "карту" из текстового файла в массив PictureBox (20 на 20)
Помогите как загрузить &quot;карту&quot; из текстового файла в массив PictureBox (20 на 20). &quot;Карта&quot; выглядит примерно так 0000000000000 ...

Из текстового файла переписать информацию в другой текстовый файл
Как это сделать? например в top.txt написано &quot;1&quot; его нужно переписать скажем в top_new.txt .Как это сделать можно?


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Обработчик клика мыши в браузере ПК и касания экрана в браузере на мобильном устройстве
8Observer8 02.02.2026
Содержание блога Для начала пошагово создадим рабочий пример для подготовки к экспериментам в браузере ПК и в браузере мобильного устройства. Потом напишем обработчик клика мыши и обработчик. . .
Философия технологии
iceja 01.02.2026
На мой взгляд у человека в технических проектах остается роль генерального директора. Все остальное нейронки делают уже лучше человека. Они не могут нести предпринимательские риски, не могут. . .
SDL3 для Web (WebAssembly): Вывод текста со шрифтом TTF с помощью SDL3_ttf
8Observer8 01.02.2026
Содержание блога В этой пошаговой инструкции создадим с нуля веб-приложение, которое выводит текст в окне браузера. Запустим на Android на локальном сервере. Загрузим Release на бесплатный. . .
SDL3 для Web (WebAssembly): Сборка C/C++ проекта из консоли
8Observer8 30.01.2026
Содержание блога Если вы откроете примеры для начинающих на официальном репозитории SDL3 в папке: examples, то вы увидите, что все примеры используют следующие четыре обязательные функции, а. . .
SDL3 для Web (WebAssembly): Установка Emscripten SDK (emsdk) и CMake для сборки C и C++ приложений в Wasm
8Observer8 30.01.2026
Содержание блога Для того чтобы скачать Emscripten SDK (emsdk) необходимо сначало скачать и уставить Git: Install for Windows. Следуйте стандартной процедуре установки Git через установщик. . . .
SDL3 для Android: Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 29.01.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами. Версия v3 была полностью переписана на Си, в. . .
Инструменты COM: Сохранение данный из VARIANT в файл и загрузка из файла в VARIANT
bedvit 28.01.2026
Сохранение базовых типов COM и массивов (одномерных или двухмерных) любой вложенности (деревья) в файл, с возможностью выбора алгоритмов сжатия и шифрования. Часть библиотеки BedvitCOM Использованы. . .
SDL3 для Android: Загрузка PNG с альфа-каналом с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 28.01.2026
Содержание блога SDL3 имеет собственные средства для загрузки и отображения PNG-файлов с альфа-каналом и базовой работы с ними. В этой инструкции используется функция SDL_LoadPNG(), которая. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru