Форум программистов, компьютерный форум, киберфорум
C++ Builder
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.92/13: Рейтинг темы: голосов - 13, средняя оценка - 4.92
2 / 2 / 3
Регистрация: 18.10.2014
Сообщений: 98
Записей в блоге: 1

Записать в переменную слово из файла

02.02.2015, 18:03. Показов 2729. Ответов 14
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Здравствуйте, я столкнулся с проблемой чтение определенного слова в файле , а именно :

есть файл (lib.txt) в нем есть запись (что то в виде структуры) :

Содержимое файла:

1 Пушкин Утро 2001
2 Есенин Береза 2002
3 ...... ..... .....
и так далее...

Есть переменная "Name", в нее мне нужно записать Название (т.е третьи слова в файле) построчно, т.е взяли 1ую строку с помощью getline() нашли там Название и записали в переменную "Name" (ну дальше эту переменную я вывожу в ListBox), и так со всеми строками в файле.

Как мне считать и записать именно Название, а не всю строку в переменную?
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
02.02.2015, 18:03
Ответы с готовыми решениями:

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

Записать второе слово из строки в переменную
Вот так я записываю второе слово строки в переменную var second_word = line.Split(' '); Но есть одно, НО. у меня второе слово...

Записать каждое слово строки в новую переменную.
Есть строка string в ней различные слова, нужно выводить по одному слову в другую строку string, вывести второй стринг cout - ом потом...

14
 Аватар для demon_7
260 / 192 / 60
Регистрация: 12.05.2013
Сообщений: 857
02.02.2015, 18:30
Для считывания файла используйте TStringList. У него есть метод (или функция) DelimitedText, которая умеет работать с разделителями и разбивать текст (по дефолту разделителем является пробел).
Разобьете весь Ваш файл через DelimitedText и получите каждое слово с новой строки, и в цикле зная позиции слов (если структура строгая, то числа будут кратны определенной позиции) вставляйте в Вашу переменную.
Для помощи посмотрите тут
Разбитие строки через DelimitedText
0
2 / 2 / 3
Регистрация: 18.10.2014
Сообщений: 98
Записей в блоге: 1
02.02.2015, 21:32  [ТС]
Цитата Сообщение от demon_7 Посмотреть сообщение
Для считывания файла используйте TStringList. У него есть метод (или функция) DelimitedText, которая умеет работать с разделителями и разбивать текст (по дефолту разделителем является пробел).
Разобьете весь Ваш файл через DelimitedText и получите каждое слово с новой строки, и в цикле зная позиции слов (если структура строгая, то числа будут кратны определенной позиции) вставляйте в Вашу переменную.
Для помощи посмотрите тут
Разбитие строки через DelimitedText
Так, в принципе я понял, получится вот так ?

C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
AnsiString filename = ComboBox1->Items->Strings[ComboBox1->ItemIndex];
AnsiString cod;
AnsiString Name;
 
TStringList *Sl = new TStringList;
Sl->LoadFromFile("Lib\\"+filename); 
int col = Sl->Count;
 
for(int i = 0; i < col; i++)
{
 
cod = getline (Sl,i); // какая то ошибка :с
/*
cod = Form2->Memo2->Lines->Strings[i]; //это я знаю как получить строку из Memo
*/ 
Sl->Delimiter = '  ';// пробелы
Sl->DelimitedText =cod; // текст который мы получили из первой строки файла
// Дальше не понимаю как записать (если разбилось на подстроки) в Name ... 
 
}
delete Sl;
Добавлено через 1 час 49 минут
Вот код, он работает

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
AnsiString filename = ComboBox1->Items->Strings[ComboBox1->ItemIndex];
AnsiString cod;
AnsiString Name;
Memo2->Lines->LoadFromFile("Lib\\"+filename);
 
TStringList *Sl = new TStringList;
 
//Sl->LoadFromFile("Lib\\"+filename);
 
int col = Memo2->Lines->Count;
 
TStringList *sl = new TStringList();
for(int i = 0; i < col; i++)
{
String s = Memo2->Lines->Strings[i];
sl->Delimiter = '  ';
sl->DelimitedText = s;
Sl->Add(s);
}
Memo2->Lines->Clear();
for (int i=0; i < sl->Count; i++)
{
Memo2->Lines->Add(sl->Strings[i]);
}
У меня файл состоит из 2х и более строчек, а тут выводит только (Переносит каждое слово на 1 строчку) последнюю запись....то бишь

1 ляляля урурурур 2000000
2 оппопопоп тыцтыцтыц 555555
3 парррарарар шШшашывашывш 9999999898874


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

3
парррарарар
шШшашывашывш
9999999898874

А где все остальное? неужто я ошибся в коде, и тогда сразу вопрос как из всего этого разбитого файла записать в поле Edit\Label определенные названия? слова в файле?
0
 Аватар для demon_7
260 / 192 / 60
Регистрация: 12.05.2013
Сообщений: 857
02.02.2015, 23:19
C++
1
2
3
4
5
6
7
8
9
10
11
12
for(int i = 0; i < col; i++)
{
String s = Memo2->Lines->Strings[i]; //здесь присвоили что то s
sl->Delimiter = '  ';
sl->DelimitedText = s; //здесь разбили этот текст в sl
Sl->Add(s);
}
Memo2->Lines->Clear();
for (int i=0; i < sl->Count; i++)
{
Memo2->Lines->Add(sl->Strings[i]); //и здесь вывели sl
}
Ваш код работает корректно. Меньше надо делать одинаковых имен.
1
2 / 2 / 3
Регистрация: 18.10.2014
Сообщений: 98
Записей в блоге: 1
03.02.2015, 00:08  [ТС]
Цитата Сообщение от demon_7 Посмотреть сообщение
Ваш код работает корректно. Меньше надо делать одинаковых имен.
Да работает, я уже так делал, но у меня же в файле есть первые и вторые и третьи строки , данный код выводит только последнюю и разбивает его..

Прикрепил программу

Этот код размещается в Form3 на ComboBox1

Создается 2 папки для библиотеки и для содержимого

Form2 работает корректно

а вот с Form3 именно с выделением нужного слова в строке файла и добавление его вListBox какая то лажа..

P.S на Form3 висит 2 Memo

Memo2 - сделал для проверки сие разбивки строки файла.
Вложения
Тип файла: rar Библиотека.rar (400.8 Кб, 3 просмотров)
0
 Аватар для demon_7
260 / 192 / 60
Регистрация: 12.05.2013
Сообщений: 857
03.02.2015, 08:15
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
void __fastcall TForm1::Button1Click(TObject *Sender)
{
TStringList *SL=new TStringList;  //Наш StringList
SL->DelimitedText=Memo1->Text; //В него взяли текст из Memo и разбили
Memo2->Text=SL->Text; //Просто чтобы Вы видели какая структура StringList
int n=2; //счетсчик смещения
for (int i=0; i<SL->Count; i++)
        {
if (i%n==0 && i>0){ //если это название книги
ListBox1->Items->Add(SL->Strings[i]); //добавили в лист бокс
n+=4; //увеличили смещение
           }
        }
delete SL;
}
Миниатюры
Записать в переменную слово из файла  
1
Модератор
 Аватар для D1973
9924 / 6460 / 2457
Регистрация: 21.01.2014
Сообщений: 27,410
Записей в блоге: 3
03.02.2015, 08:23
Ну вот так как-то...
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
#include<memory>
...
void __fastcall TForm1::Button1Click(TObject *Sender)
{
  std::auto_ptr<TStringList>sl_0(new TStringList);
  std::auto_ptr<TStringList>sl_1(new TStringList);
  sl_0->LoadFromFile("c:\\1\\lib.txt");
  for(int i = 0; i < sl_0->Count; i++)
   {
     sl_1->Clear();
     sl_1->CommaText = sl_0->Strings[i];
     ListBox1->Items->Add(sl_1->Strings[2]);
   }
}
Т.е. из такого вот файла
1 Пушкин Утро 2001
2 Есенин "Белая береза" 2002
3 Лермонтов Парус 2003
получается то, что на картинке
Единственное, о чем надо позаботиться - это то, чтобы названия, содержащие 2 и более слова, были заключены в кавычки.
Миниатюры
Записать в переменную слово из файла  
2
 Аватар для demon_7
260 / 192 / 60
Регистрация: 12.05.2013
Сообщений: 857
03.02.2015, 08:27
Nyiann, хочу заметить что у D1973, более гибкий алгоритм :3
1
2 / 2 / 3
Регистрация: 18.10.2014
Сообщений: 98
Записей в блоге: 1
03.02.2015, 15:15  [ТС]
demon_7,D1973, Спасибо, я разобрался сегодня сам (: теперь я понимаю как это все работает , у меня выводилась последняя строка файла в разбитом виде из-за цикла вывода в Memo, его надо было поместить в цикл где собственно идет разбивка строки (:


C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
TStringList *Sl = new TStringList;
TStringList *sl = new TStringList();
 
Sl->LoadFromFile("Lib\\"+filename);
col = Sl->Count;
 
for(int i = 0; i < col; i++)
{
AnsiString s = Sl->Strings[i]; //ïðèñâîèëè ñòðîêó s
sl->Delimiter = ';';
sl->DelimitedText = s; //ðàçáèëè òåêñò â sl
 
for (int j=0; j < sl->Count; j++) // Этот цикл был расположен за циклом по i
{
Memo2->Lines->Add(sl->Strings[j]); // âûâåëè sl
}
}
а в общем для вывода определенного слова мне понадобилась структура вот и все (:

вот код :

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
ListBox1->Items->Clear();
Memo1->Lines->Clear();
 
AnsiString filename = ComboBox1->Items->Strings[ComboBox1->ItemIndex];
AnsiString cod;
 
TStringList *Sl = new TStringList;
TStringList *sl = new TStringList();
 
Sl->LoadFromFile("Lib\\"+filename);
col = Sl->Count;
 
for(int i = 0; i < col; i++)
{
AnsiString s = Sl->Strings[i]; //ïðèñâîèëè ñòðîêó s
sl->Delimiter = ';';
sl->DelimitedText = s; //ðàçáèëè òåêñò â sl
 
for (int j=0; j < sl->Count; j++)
{
Memo2->Lines->Add(sl->Strings[j]); // âûâåëè sl
}
}
 
col1=Memo2->Lines->Count;
a=col1;
bibl* bib = new bibl[col1];
int j=0;
for(int i=0;i<col;i++)
{
bib[i].id=Memo2->Lines->Strings[j].ToInt();
bib[i].name=Memo2->Lines->Strings[j+1];
bib[i].autor=Memo2->Lines->Strings[j+2];
bib[i].year=Memo2->Lines->Strings[j+3];
ListBox1->Items->Add(bib[i].name);
j=+4;
}
delete Sl;
delete sl;
только есть одна проблема с выводом, структура у меня объявлена вот так в *.h файле в Private

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
private:    // User declarations
 
struct bibl
{
AnsiString name;
AnsiString autor;
AnsiString year;
int id;
};
int col1;
bibl* bib;
public:     // User declarations
        __fastcall TForm3(TComponent* Owner);
};
вот..., теперь мне нужно при нажатии хоть на кнопку или при выборе элемента в ListBox1 , чтобы по ID выбранного элемента вывелось 2 параметра а именно "Год" и "Автора"..

Я вот так сделал , но выдает ошибку :с

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
void __fastcall TForm3::ListBox1Click(TObject *Sender)
{
Memo1->Lines->Clear();
AnsiString filename = ListBox1->Items->Strings[ListBox1->ItemIndex];
Memo1->Lines->LoadFromFile("Book\\"+filename+".txt");   // загружаем
Edit1->Text=ListBox1->Items->Strings[ListBox1->ItemIndex];// выводим название (работает корректно)
 
/* После добавления Этого (ниже 2 строки) выдает ошибку :с  */
 
Edit2->Text=bib[ListBox1->ItemIndex].autor;
Edit3->Text=bib[ListBox1->ItemIndex].year;
 
}
в чем проблема?
Миниатюры
Записать в переменную слово из файла  
0
Я Фоюмчанин ? дааааа)
 Аватар для ivan.-94
213 / 204 / 23
Регистрация: 02.06.2012
Сообщений: 1,424
Записей в блоге: 12
03.02.2015, 15:22
Nyiann, Этот так интересно скинуть куски кода, скрин ошибки и спросить в чем дело - тут тоже обычные люди без экстрасенсорных способностей
Ставите точку останова и дебагом шлепаете шаг за шагом и находите где ошибка - дерзайте.
Проверяйте переменные - что в них хранится, что куда передается.
0
 Аватар для demon_7
260 / 192 / 60
Регистрация: 12.05.2013
Сообщений: 857
03.02.2015, 15:25
А это норм ?
C++
1
struct bibl
и
C++
1
Edit2->Text=bib[ListBox1->ItemIndex].autor;
конкретнее
C++
1
bib[ListBox1
Компилятор не ругается?
0
Почетный модератор
Эксперт С++
 Аватар для SatanaXIII
5851 / 2862 / 392
Регистрация: 01.11.2011
Сообщений: 6,906
03.02.2015, 15:28
Цитата Сообщение от Nyiann Посмотреть сообщение
C++
1
2
3
4
5
struct bibl 
{ 
AnsiString name; 
AnsiString autor; 
AnsiString year;
Вы серьезно? )) Автор? Год? У библ? 8)
0
2 / 2 / 3
Регистрация: 18.10.2014
Сообщений: 98
Записей в блоге: 1
03.02.2015, 15:49  [ТС]
SatanaXIII, а что тут не понятного?
есть структура библиотека, у нее есть поля (Автор, Id, Год, Название), как бы все верно , к тому же смысл придраться к названиям?

ivan.-94, был бы таким умным не писал бы здесь, ибо билдер как таковой не преподают (тока дают задания и все мол изучили консоль с++ теперь это по зубам все) , все сам изучаю и обращаюсь сюда за помощью хм (:
И способностей не надо просто прикреплю файл вот и все дела.

demon_7,

Конкретика, Мне нужно чтобы при нажатии(выборе) параметра\названия в ListBox1 (там у каждой строки есть свой id) в поля Edit2 и Edit3 вывелось то что лежит(записано\добавлено) в массив bib.

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

Для того чтоб вывести в Edit3 и Edit4 я написал вот этот код

C++
1
2
Edit2->Text=bib[ListBox1->ItemIndex].autor; 
Edit3->Text=bib[ListBox1->ItemIndex].year;
Edit2->Text=bib[ListBox1->ItemIndex].autor;

bib[ListBox1->ItemIndex].autor - Тут это (ListBox1->ItemIndex) играет роль индекса ID ибо если мы кликнем по полю ListBox И выберем там что то у нас запишется в место этого (ListBox1->ItemIndex) № выбранного нами элемента..

Прикрепил файлы
Вложения
Тип файла: rar Библиотека3.rar (349.4 Кб, 3 просмотров)
0
Я Фоюмчанин ? дааааа)
 Аватар для ivan.-94
213 / 204 / 23
Регистрация: 02.06.2012
Сообщений: 1,424
Записей в блоге: 12
03.02.2015, 16:13
Цитата Сообщение от Nyiann Посмотреть сообщение
ибо билдер как таковой не преподают
А билдер тут не причем. Debug есть не только в билдере - это основа основ)))

Добавлено через 12 минут
А что вам собственно у вас не нравится? все правильно

Добавлено через 1 минуту
Nyiann, У вас структура пустая, вы же и создаете и заполняете массив bibl* bib = new bibl[col1]; в
void __fastcall TForm3::ComboBox1Change(TObject *Sender)
У вас же массив не глобальный! он существует только в ComboBox1Change

Добавлено через 2 минуты
В void __fastcall TForm3::ComboBox1Change(TObject *Sender)
Замените bibl* bib = new bibl[col1] на bib = new bibl[col1]

Добавлено через 51 секунду
И зачем вы описываете структуру 2 раза? и в *.cpp и в *.h - удалите из cpp

Добавлено через 2 минуты

Не по теме:

Цитата Сообщение от Nyiann Посмотреть сообщение
был бы таким умным не писал бы здесь
Вам никто не грубил. Был бы рад узреть извинения

1
2 / 2 / 3
Регистрация: 18.10.2014
Сообщений: 98
Записей в блоге: 1
03.02.2015, 16:16  [ТС]
Цитата Сообщение от ivan.-94 Посмотреть сообщение
В void __fastcall TForm3::ComboBox1Change(TObject *Sender)
Замените bibl* bib = new bibl[col1] на bib = new bibl[col1]
во, вот это теперь работает , заменил , странно я так делал но не получилось , я только не объявлял в *.h -
bibl* bib;

а теперь все работает (: спасибо

Цитата Сообщение от ivan.-94 Посмотреть сообщение
И зачем вы описываете структуру 2 раза? и в *.cpp и в *.h - удалите из cpp
заметил , удалил уже (:

Все спасибо тему можно закрыть получается :з
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
03.02.2015, 16:16
Помогаю со студенческими работами здесь

Открытие файла через OpenFileDIalog и записать имя файла в переменную
Можно ли в формах Pascal ABC Net, открыв файл через openfiledialog, записать в строковую переменную полное имя файла?

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

Записать имя файла в переменную
Здравствуйте, Возможно ли, вместо того , чтобы использовать SAD.open(&quot;Batch.cmd&quot;) ofstream SAD; SAD.open(...

Определить в K-ой строке файла fin.txt самое длинное слово и записать это слово и его длину в файл fout.txt
Есть задание: Определить в K-ой строке файла fin.txt самое длинное слово и сформировать текстовый файл fout.txt, в который записать это...

Записать в переменную заданный элемент файла
Составить программу ,которая в переменной n будет получать 5-й элемент вещественного файла Fx.


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

Или воспользуйтесь поиском по форуму:
15
Ответ Создать тему
Новые блоги и статьи
SDL3 для Desktop (MinGW): Рисуем цветные прямоугольники с помощью рисовальщика SDL3 на Си и C++
8Observer8 17.03.2026
Содержание блога Финальные проекты на Си и на C++: finish-rectangles-sdl3-c. zip finish-rectangles-sdl3-cpp. zip
Символические и жёсткие ссылки в Linux.
algri14 15.03.2026
Существует два типа ссылок — символические и жёсткие. Ссылка в Linux — это запись в каталоге, которая может указывать либо на inode «файла-ИСТОЧНИКА», тогда это будет «жёсткая ссылка» (hard link),. . .
[Owen Logic] Поддержание уровня воды в резервуаре количеством включённых насосов: моделирование и выбор регулятора
ФедосеевПавел 14.03.2026
Поддержание уровня воды в резервуаре количеством включённых насосов: моделирование и выбор регулятора ВВЕДЕНИЕ Выполняя задание на управление насосной группой заполнения резервуара,. . .
делаю науч статью по влиянию грибов на сукцессию
anaschu 13.03.2026
прикрепляю статью
SDL3 для Desktop (MinGW): Создаём пустое окно с нуля для 2D-графики на SDL3, Си и C++
8Observer8 10.03.2026
Содержание блога Финальные проекты на Си и на C++: hello-sdl3-c. zip hello-sdl3-cpp. zip Результат:
Установка CMake и MinGW 13.1 для сборки С и C++ приложений из консоли и из Qt Creator в EXE
8Observer8 10.03.2026
Содержание блога MinGW - это коллекция инструментов для сборки приложений в EXE. CMake - это система сборки приложений. Здесь описаны базовые шаги для старта программирования с помощью CMake и. . .
Как дизайн сайта влияет на конверсию: 7 решений, которые реально повышают заявки
Neotwalker 08.03.2026
Многие до сих пор воспринимают дизайн сайта как “красивую оболочку”. На практике всё иначе: дизайн напрямую влияет на то, оставит человек заявку или уйдёт через несколько секунд. Даже если у вас. . .
Модульная разработка через nuget packages
DevAlt 07.03.2026
Сложившийся в . Net-среде способ разработки чаще всего предполагает монорепозиторий в котором находятся все исходники. При создании нового решения, мы просто добавляем нужные проекты и имеем. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru