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

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

25.09.2019, 17:39. Показов 3828. Ответов 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
Модератор
 Аватар для D1973
9939 / 6475 / 2459
Регистрация: 21.01.2014
Сообщений: 27,452
Записей в блоге: 3
28.09.2019, 13:47
Студворк — интернет-сервис помощи студентам
Цитата Сообщение от QuantumSH Посмотреть сообщение
должен быть обязательно глобальным
У Вас консольное приложение? Если нет - почему его не сделать полем класса формы? Приватным, если приложение состоит из одной формы или публичным, если форм несколько и надо использовать этот массив в любой из форм... Но тогда прямой смысл вынести этот массив в отдельный модуль и подключать его при необходимости...
Цитата Сообщение от QuantumSH Посмотреть сообщение
программа создаст компоненты с номерами
Вот это и далее - вообще не понял задумки...
Цитата Сообщение от QuantumSH Посмотреть сообщение
КАК это реализовать?
Как в обычном массиве: B[i] = 0;
Цитата Сообщение от QuantumSH Посмотреть сообщение
Следует ли повторно конвертировать значения в список StringList?
Я бы сделал именно так... Но, возможно, volvo посоветует ofstream()...

Не по теме:

Лично мне просто не нравятся методы чистого C++ для работы с файлами...

0
0 / 0 / 0
Регистрация: 10.08.2019
Сообщений: 21
28.09.2019, 14:16  [ТС]
Цитата Сообщение от D1973 Посмотреть сообщение
Как в обычном массиве: B[i] = 0;
Вот в том и дело что не работает...
Изменить значение вектора простым присваиванием не получается, вероятно, нужны какие-то его, вектора, методы.
Вот как программа создает стикеры с отсутствующими индексами (те, которые были созданы и сохранены ранее, автоматически загрузились - соответственно тому коду, который прочитал значения из масива massiv.txt):

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
for (int i=1; i<=10; i++)
      {
          if(!BStick[i]) // если значение по индексу == НОЛЬ,
         // по клику кнопы создаем стикер соответствующего индекса 
          {
              TFClient *NewForm = new TFClient(this);
              NewForm->Caption = "Стикер " + IntToStr(i);
              NewForm->Visible = true;
              BStick[i] = 1; // изменяем текущий индекс, чтобы 
         // при следущем клике кнопы этот индекс уже был занят и взят другой
              break;
          }
       }
}
Все это работает.

Но вот когда какой-то стикер закрывается, то бишь уничтожается, в обработчике формы стикера (это другая форма - поэтому массив или вектор объявляется глобальным!) OnClose также значения по соответствующему индексу должно быть приведено в ноль, чтобы этот индекс был свободным для повторного создания стикера.
Получить индекс конкретного стикера несложно; но передача его обратно по

C++
1
BStick[i] = 0;
в модуле другой формs (формы-шаблона стикера) не работает: ошибок компиляции нет, но есть ошибка времени выполнения - самая сложная...
0
Модератор
 Аватар для D1973
9939 / 6475 / 2459
Регистрация: 21.01.2014
Сообщений: 27,452
Записей в блоге: 3
28.09.2019, 20:32
Цитата Сообщение от QuantumSH Посмотреть сообщение
Изменить значение вектора простым присваиванием не получается, вероятно, нужны какие-то его, вектора, методы
С чего Бы это? Ничего не надо... Вы же сами себя опровергаете своим кодом:
Цитата Сообщение от QuantumSH Посмотреть сообщение
BStick[i] = 1; // изменяем текущий индек
Что это, как не изменение значения элемента вектора с 0 на 1 безо всяких дополнительных "собственных методов"
Цитата Сообщение от QuantumSH Посмотреть сообщение
но есть ошибка времени выполнения
1. Какая ошибка? Хоть бы скрин приложили, что ли...
2. Есть подозрение, что просто Вы что-то с областью видимости запутались... Я же Вам уже говорил - уносите объявление вектора в отдельный модуль и прицепляйте этот модуль в модуле класса новой Вашей формы... Совсем ни к чему, чтобы дочерняя форма что-либо "знала" о родительской, а уж оперировать ее глобальными переменными - это совсем уже не по феншую... Принцип инкапсуляции пока никто не отменял...
0
0 / 0 / 0
Регистрация: 10.08.2019
Сообщений: 21
28.09.2019, 20:47  [ТС]
Цитата Сообщение от D1973 Посмотреть сообщение
Есть подозрение, что просто Вы что-то с областью видимости запутались... etc.
Возможно, еще раз проверю все когда загружусь в винду.
Хотя, разве простое подключение h-файла основной формы к модулю дочерней с помощью #include не должно разрешить видеть объявленный в h-файле вектор?

Добавлено через 8 минут
Кстати, у меня в проекте билдера все h-файлы (от трех форм) почему-то подключены друг ко другу в файлах реализации - .cpp ... Это правильно? Не должны ли они быть подключаемы друг ко другу взаимно в h-файлах? Или я чего-то не понимаю?..
0
Модератор
 Аватар для D1973
9939 / 6475 / 2459
Регистрация: 21.01.2014
Сообщений: 27,452
Записей в блоге: 3
28.09.2019, 22:44
Еще раз повторюсь: дочерние формы надо подключать к главной, для того, чтобы создать и Show() сделать... Но использовать свойства и методы дочерних форм в главной - это уже не кошерно... Но вот главную форму к дочерним подключать не надо ни в коем случае!!! Не должны они знать о ее существовании... Нет ее для них - и точка! Повторите основные принципы ООП!
Цитата Сообщение от QuantumSH Посмотреть сообщение
взаимно в h-файлах?
Нарветесь на перекрестные ссылки...
0
0 / 0 / 0
Регистрация: 10.08.2019
Сообщений: 21
29.09.2019, 02:31  [ТС]
Цитата Сообщение от D1973 Посмотреть сообщение
Но вот главную форму к дочерним подключать не надо ни в коем случае!!!
Хорошо. Вот алгоритм работы программы.
Дочерняя форма - это просто заготовка стикеров, которые создаются лишь по желанию пользователя из главной формы. Они нумерованы от 1 до 10 - чтобы программа "помнила", какие были созданы, и при повторном запуске создавала те же что были созданы при закрытии программы в прошлый раз (т.е. в прошлом сеансе работы программы).

Но стикер можно просто закрыть - тогда он удаляется и память освобождается. При закрытии стикера закрывается знамо дело дочерняя форма, в ее обработчике счетчику (в нрашем случае определенному значению в векторе) присваивается НОЛЬ. Но этот вектор объявлен в модуле ГЛАВНОЙ формы, а не дочерней, при этом доченяя должна с ним работать - как минимум чтобы изменить одно из значенирй при закрытии!!
и если не подключать главную форму к дочерней (т.е. хидер к хидеру), то как дочерняя "узнает" о существовании вектора, который объявлен в хидере главной формы?
Как я понимаю, Вы предлагаете создать вообще отдельный третий модуль, и туда прописать вектор (и все остальное что должно быть глобальным). В таком случае этот модуль к чему подключать - к модулю главной, дочерней, или к обеим??? А то я че-то уже запутался... (((

Добавлено через 3 часа 37 минут
Цитата Сообщение от lifeforce Посмотреть сообщение
для сохранения в файл txt - надо.
и очень легко.
Этот код работает НЕВЕРНО: он ДОписывает значения в файл massiv.txt, а нужно, чтобы ЗАМЕНИЛ все значения на новые.
0
Модератор
 Аватар для D1973
9939 / 6475 / 2459
Регистрация: 21.01.2014
Сообщений: 27,452
Записей в блоге: 3
29.09.2019, 09:09
Цитата Сообщение от QuantumSH Посмотреть сообщение
В таком случае этот модуль к чему подключать - к модулю главной, дочерней, или к обеим???

Не по теме:

Вы - начальник и Вы находитесь в кабинете со своим подчиненным. Оба Вы пьете кофе... Где хранить кофейные принадлежности? Можно в тумбочке подчиненного, но не всегда удобно, а иногда и просто невозможно отвлекать подчиненного, чтобы попасть в его тумбочку... Можно в Вашей, но это уж будет вообще прямое нарушение субординации, чтобы подчиненный лазил в тумбочке начальника. Логичнее всего поставить отдельную тумбочку, куда и у Вас и у подчиненного будет доступ независимо друг от друга...


Аналогия, я думаю, понятна...
0
 Аватар для lifeforce
266 / 211 / 89
Регистрация: 27.09.2010
Сообщений: 1,234
30.09.2019, 22:04
Цитата Сообщение от QuantumSH Посмотреть сообщение
Этот код работает НЕВЕРНО: он ДОписывает значения в файл massiv.txt, а нужно, чтобы ЗАМЕНИЛ все значения на новые.
Ну , уж уважаемый , мне трудно медитировать не зная ваш код, алгоритм и логические ответвления в программе.
я даю только дельную подсказку.

точно так же можно и новые значения сохранить.
0
0 / 0 / 0
Регистрация: 10.08.2019
Сообщений: 21
02.10.2019, 00:45  [ТС]
Цитата Сообщение от lifeforce Посмотреть сообщение
Ну , уж уважаемый , мне трудно медитировать не зная ваш код, алгоритм и логические ответвления в программе.
Зачем это для решения сброса массива в файл??
Ведь написал же D1973 обратный алгоритм без вникания в остальной код - и все прекрасно работает.

Добавлено через 3 часа 33 минуты
Для заинтересованных - вот еще раз общая логика работы программы.

Программа-органайзер имеет дополнительную функцию - создает стикеры для размещения их на десктопе.
Можно создать от 1 до 10 стикеров (число взято для примера и чисто произвольное).

1. При загрузке программа читает из текстового файла массив чисел от 0 до 10 (всего - 11 цифр), где нуль пропускается (для простоты счета), и загружает массив булевыми значениями - нулями или единицами. Скажем, текстовый файл в котором есть запись 0 0 0 1 0 1 0 1 0 0 0 - преобразуется в массив (или, по подсказке уважаемого D1973, вектор), где BStick[3], BStick[5] и BStick[7] будут соответсвенно инициализированы единицами, остальные числа - нулями. При создании главной формі программі в обработчике OnCreate срабатывает код

C++
1
2
3
4
5
6
7
8
9
10
for (int i=1; i<=10; i++)
      {
          if(BStick[i])
          {
              TFClient *NewForm = new TFClient(this);
              NewForm->Caption = "Стикер " + IntToStr(i);
              NewForm->Visible = true;
              continue;
          }
       }
в котором создаются стикеры с заглавиями "Стикер 3", "Стикер 5" и "Стикер 7" соответственно.

2. Дальше, можно в процессе сеанса работы с программой создать и другие стикеры - причем программа по отдельному обработчику нажатия на кнопу "Создать стикер" проверят вектор BStick на наличие в нем нулей, и создает стикеры с индексами, которым соответствуют нули, при этом меняя их значения на единицу:

C++
1
2
3
4
5
6
7
8
9
10
11
for (int i=1; i<=10; i++)
      {
          if(!BStick[i])
          {
              TFClient *NewForm = new TFClient(this);
              NewForm->Caption = "Стикер " + IntToStr(i);
              NewForm->Visible = true;
              BStick[i] = 1;
              break;
          }
       }
Эти два обработчика работают на "ура" (еще раз спасибо D1973).

======================================== ======
Теперь то, что не работает.

В процессе сеанса работы могут быть созданы новые стикеры, а могут быть некоторые удалены. К примеру, мы загрузили программу со стикерами "Стикер 3", "Стикер 5" и "Стикер 7" (как в прмере выше), удалили "Стикер 3", но при этом создали "Стикер 1" и "Стикер 1". И закрыли программу.
Теперь
3. При удалении стикера закрывается ДОЧЕРНЯЯ форма (форма-шаблон, на основании которого и создаются стикеры, изначально встроенные в главную форму с помощью Drag&Dock). Итак в обработчике событие OnClose стикера (доченей формы) вектор BStick должен на месте индекса стикера (который он читает по свойству Caption из самой формы - напр., "Стикер 5"! поставить НУЛЬ, т.е. освободить индекс для создания опять когда-нибудь стикера с таким же индексом).
Но когда я обработчике событий OnClose дочерней формы я передаю ГЛОБАЛЬНОМУ (объявленному в отдельном файле, как советовали) вектору BStick значение НУЛЬ - обычным присваиванием -
C++
1
BStick[7] = 1;
-
программа вылетает с ошибкой "Access violation at address (какой-то адресс). Address of write 00000000" ... Почему? и как это исправить?
4. Наконец, программа должна "запомнить", какие стикеры в ней созданы теперь - то есть уже не 3, 5 и 7, а 1, 2, 5 и 7). Соответсвенно в обработчике событий OnClose главного окна индексы стикеров должны быт записаны обратно из вектора - в файл, и он должен быть ПЕРЕзаписан к следующему виду: 0 1 1 0 0 1 0 1 0 0 0. Как это реализовать? Вышенаведенный lifeforce код не ПЕРЕзаписывает файл, а ДОписывает цифры к его содержимому.
0
Модератор
 Аватар для D1973
9939 / 6475 / 2459
Регистрация: 21.01.2014
Сообщений: 27,452
Записей в блоге: 3
02.10.2019, 07:36
Цитата Сообщение от QuantumSH Посмотреть сообщение
создает стикеры
Когда я слышу слово "стикер", то первая ассоциация - это разноцветные липкие бумажки, на которых тетеньки из бухгалтерии любят писать всякие нужные напоминалки, в частности, логин и пароль, а потом лепить их на монитор...

Если Вы реализовываете что-то аналогичное, то, как по мне, одного индекса пусто/не пусто недостаточно... Тут идеально подойдет INI-файл, где каждая секция - описание отдельной формы-стикера: ее размер, положение, текст на стикере, цвет стикера... Тогда алгоритм будет примерно таким:
1. При старте программы ищем наш INI-файл. Если его нет - никаких стикеров изначально не создаем, делаем список свободных индексов, куда вносим все значения от 1 до 10.
2. При создании нового стикера ему присваивается первый свободный индекс от 1 до 10... Этот индекс будет именем секции ини-файла, описывающей данный стикер. Создали форму - записали новую секцию - добавили индекс в список занятых - удалили его из списка свободных; закрыли форму - удалили секцию - индекс вернули в список свободных, из списка занятых его удалили...
3. Если при старте приложения ини-файл присутствует - читаем из него список секций - получаем список занятых индексов, составляем список отсутствующих индексов. При создании нового - присваиваем первый свободный индекс, при удалении - удаляем из списка занятых и добавляем обратно в список свободных...

Ну это так, просто черновик, так сказать - информация к размышлению...
0
0 / 0 / 0
Регистрация: 10.08.2019
Сообщений: 21
02.10.2019, 09:13  [ТС]
Цитата Сообщение от D1973 Посмотреть сообщение
Тут идеально подойдет INI-файл
Честно - мне тоже такая же мысль приходила в голову, но мне показалось, что реализовать через ини-файл еще труднее... ))))))))))))))))))))))))
Но все же - если реализовать через ini, то все равно без массива не обойтись. Или мне так кажется.
Цитата Сообщение от D1973 Посмотреть сообщение
Создали форму - записали новую секцию - добавили индекс в список занятых - удалили его из списка свободных;
ЭТО - реализовано;
Цитата Сообщение от D1973 Посмотреть сообщение
закрыли форму - удалили секцию - индекс вернули в список свободных, из списка занятых его удалили...
ЭТО - НЕ реализовано!) И все по кругу...
Цитата Сообщение от D1973 Посмотреть сообщение
Если при старте приложения ини-файл присутствует - читаем из него список секций - получаем список занятых индексов...
То есть сам массив можно тоже прописать в ini-файл? Я всегда думал что там должны быть только настройки типа ИМЯ=ЗНАЧЕНИЕ...
0
Модератор
 Аватар для D1973
9939 / 6475 / 2459
Регистрация: 21.01.2014
Сообщений: 27,452
Записей в блоге: 3
02.10.2019, 10:35
Лучший ответ Сообщение было отмечено QuantumSH как решение

Решение

Цитата Сообщение от QuantumSH Посмотреть сообщение
Я всегда думал что там должны быть только настройки типа ИМЯ=ЗНАЧЕНИЕ
так и есть, но только не совсем:
[ИМЯ_СЕКЦИИ_1]
Имя_параметра_1=Значение
Имя_параметра_2=Значение
[ИМЯ_СЕКЦИИ_2]
Имя_параметра_1=Значение
Имя_параметра_2=Значение
так вот - эти имена секций можно считать за один заход и сразу получить готовый список имен секций (метод ReadSections() класса TIniFile)... А если принять, что имя секции - это индекс формы-стикера - вот у нас сразу и получится список занятых индексов...
1
0 / 0 / 0
Регистрация: 10.08.2019
Сообщений: 21
02.10.2019, 12:55  [ТС]
Цитата Сообщение от D1973 Посмотреть сообщение
А если принять, что имя секции - это индекс формы-стикера - вот у нас сразу и получится список занятых индексов...
Вы имеете в виду если принять "имя=значение" как "0=false", "1=true" и т.д. ??
0
0 / 0 / 0
Регистрация: 10.08.2019
Сообщений: 21
21.10.2019, 17:46  [ТС]
Все реализовано с помощью ini-файла. Всем спасибо за дельные советы!!! Тему можно закрыть.
0
 Аватар для lifeforce
266 / 211 / 89
Регистрация: 27.09.2010
Сообщений: 1,234
21.10.2019, 22:07
QuantumSH,
тема будет закрыта автоматически - когда поставишь правильный ответ тому кто реально решил твой вопрос темы.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
21.10.2019, 22:07
Помогаю со студенческими работами здесь

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

Динамически создаваемый массив 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 .Как это сделать можно?


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

Или воспользуйтесь поиском по форуму:
35
Ответ Создать тему
Новые блоги и статьи
Транскрипция 55-минутного видео через Whisper: WhisperDesktop облажался, спас Google Colab[
anaschu 01.06.2026
Понадобилось получить текст из свежезагруженного видео на YouTube. Казалось бы, задача на пять минут. Заняла полтора часа. Делюсь опытом — может кому пригодится последовательность решений. . . .
21 мат мед. Планы на развитие модели здравоСохранения
anaschu 01.06.2026
AnyLogic: план развития симуляционной модели рабочего коллектива — динамический абсентеизм, реальные данные, три сценария сравнения Продолжаю серию постов о дискретно-событийной модели рабочего. . .
20. Мат мед. Абсентеизм как отдельный тип простоя
anaschu 29.05.2026
Апдейт модели: исправленные баги, абсентеизм и новые механизмы Продолжаю развивать ранее описанную модель рабочего коллектива на AnyLogic. За последние несколько дней был проведён серьёзный. . .
19. здоровье, усталость и психотип работника влияют на производительность предприятия, и наоборот, производительность на здоровье, усталось и психотип
anaschu 28.05.2026
Дискретно-событийная модель рабочего коллектива на AnyLogic: здоровье, выгорание, психотипы и микростимуляция Привет, коллеги. Хочу поделиться итогами нескольких недель работы над симуляционной. . .
"Прокси" для последовательного порта
Eddy_Em 28.05.2026
Эту штуку написал я достаточно давно. Но сейчас вот понадобилось настроить датчик грозы, но при этом не отключать его от "метеодемона". Соответственно, надо запустить этот "прокси": метеодемон будет. . .
Рефакторинг программы уравнивания.
Massaraksh7 26.05.2026
Пример по предыдущей записи в блоге. Но, надо заметить, что, во-первых, там оптимизация не только математики, но и работы с базой данных, и с графами, а во-вторых, это ещё не всё.
Использование TThread в Lazarus для математических вычислений.
Massaraksh7 25.05.2026
Производя рефакторинг своих программ на предмет ускорения их работы, обратил внимание на такой аспект, как сокращение времени матвычислений. Дело в том, что приходится работать с большими матрицами. . .
Модель здравосохранения 18. Чем здоровее работник, тем быстрее выгорает
anaschu 24.05.2026
Имитационная модель корпоративного здравоохранения: что показывает математика Сегодня в модели рабочего коллектива на AnyLogic появились три новые механики — выгорание через накопленную усталость,. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru