C++ Builder
| Главная | Уроки | Статьи | FAQ | Форум | Downloads | Литература | Ссылки | RXLib | Диски |

 
Поиск в текстовых файлах, помогите разобраться
Dae
  Отправлено: 02.12.2004, 14:39


Не зарегистрирован







Приветствую,
только что начал изучать BC++ Builder, причём, без какого-либо опыта в других языках. Естественно, любая задача, считающаяся простой по дефолту для обычного начинающего программиста кажется проблемой века для меня.

Проблема такова, у меня есть .txt (если конкретнее, файл настройки .ini) файл, программа должна его открыть, найти там определённый текст, считать его до конца строчки и вывести, ну, хотя бы, в элемент label1.

Единственное с чем я смог разобраться отсюда — это открытие файла. И всё. ohmy.gif

Туториалов на тему поиска в текстовых файлах нету нигде, ни во всемирном и-нете, ни в Рунете, нету ни в одной из 10 книжек по Си.

Помогите!

Заранее благодарю!
Gedeon
Отправлено: 02.12.2004, 15:17


Ветеран

Группа: Модератор
Сообщений: 1742



Поиск тут нафиг не надо применять в ВСВ есть такой класс TIniFile, вот им и пользуйтесь, см. хэлп.

А вот вам прямо из хэлпа и примерчик
CODE

This example reads the myapp.ini file and displays on the form the status of your auto save options.
Before you run this example, you must include IniFiles.hpp in your unit.

void __fastcall TForm1::FormCreate(TObject *Sender)

{
 TIniFile *pIniFile = new TIniFile("c:\\MyApp\\bin\\MyApp.ini");
 if (pIniFile->ReadBool("AutoLoad", "FormProperties", false) == true)
 {
   Visible = pIniFile->ReadBool("FormOptions", "Visible", true);
   Color = (Graphics::TColor)pIniFile->ReadInteger("FormOptions", "Color", clWindow);
   Caption = pIniFile->ReadString("FormOptions", "Caption", "Main");
 }
 delete pIniFile;
}

Структуру ини файлов надеюсь знаете?
Guest
Отправлено: 02.12.2004, 17:46


Не зарегистрирован







Мда, спасибо!
Всё в хелпе нашёл, полезная штука. Казалось бы даже разобрался, но не пашет sad.gif
Dae
Отправлено: 02.12.2004, 17:49


Не зарегистрирован







Сорри,
случайно пред. пост запостил.
Вот есть brb.ini:

[Getit]
CacheSize=642

Нужно достать значение 642 и вывести его в Label2

Вот как я это хотел достать:
[CODE]
void __fastcall TForm1::FormCreate(TObject *Sender)
{
TIniFile *ini;
ini = new TIniFile("brb.ini");
Label2 -> Caption = ini->ReadInteger("Getit", "CacheSize", 000 );

delete ini;
}

[CODE]
Он не пишет ошибок, а вместо Label2->Caption говорит 000. Значит, что-то он не нашёл, что-ли.
AVC
Отправлено: 02.12.2004, 18:10


Ветеран

Группа: Модератор
Сообщений: 1583



Чудес не бывает. smile.gif
Либо ошибка в именах, либо файл не тот или не там (не в текущем каталоге).
Для фала параметров удобно пользоваться кодом
FIniFile = new TIniFile (ChangeFileExt(Application->ExeName, ".ini"));
Dae
Отправлено: 02.12.2004, 18:24


Не зарегистрирован







Чудеса бывают biggrin.gif Только не здесь...

Да, может быть, но для проверки я заставил Memo1 показывать содержимое файла
[CODE]
Memo1->Lines->Clear();
Memo1->Lines->LoadFromFile("brb.ini");
[CODE]
И оно показывает. А тот код не хочет. ohmy.gif
AVC
Отправлено: 03.12.2004, 09:03


Ветеран

Группа: Модератор
Сообщений: 1583



Оригинал в студию! (brb.ini и кусок кода)
Зарегестрируйтесь и прицепите файлы. Интересно посмотреть.
Daedalus
Отправлено: 03.12.2004, 09:52


Ученик-кочегар

Группа: Участник
Сообщений: 8



Вот и я. Помучался, но, ученье в том и состоит — чтобы пытаться и пытаться, так решать проблемы, а потом уже разбираться biggrin.gif
Всё заработало, когда добавил функцию ExtractFilePath из какого-то учебника по Дельфи...
CODE

TIniFile *ini = new TIniFile(ExtractFilePath(Application->ExeName)+"brb.ini");


Отредактировано Daedalus — 03/12/2004, 11:19
avc*
Отправлено: 03.12.2004, 10:18


Не зарегистрирован







Это и было "файл не там" smile.gif А говорили "чудеса бывают", ан нет sad.gif
Gal
Отправлено: 03.12.2004, 16:53


Станционный диспетчер

Группа: Участник
Сообщений: 124



Воспользуйся
TStringList *StrList = new TStringList();

У него есть методы работать именно с ini- файлами
т.е. структуры выражение=значение.
Dimon.Ru
Отправлено: 17.12.2004, 16:52


Станционный диспетчер

Группа: Участник
Сообщений: 92



QUOTE (Dae @ 02/12/2004, 19:26)
Чудеса бывают biggrin.gif Только не здесь...

Да, может быть, но для проверки я заставил Memo1 показывать содержимое файла
[CODE]
Memo1->Lines->Clear();
Memo1->Lines->LoadFromFile("brb.ini");
[CODE]
И оно показывает. А тот код не хочет. ohmy.gif

Я уже замечал, что если прочитать файл таким образом:
Memo1->Lines->LoadFromFile("brb.ini");

то файл берется из ТЕКУЩЕГО каталога, а вот если писать так:
ini = new TIniFile("brb.ini");

то файл берется "brb.ini" читается из каталога "c:\windows\" или "с:\md" как у меня smile.gif

я взял за правило (и всем советую) ВСЕГДА писать полное имя файла. мало ли потом Вы в программе поменяете текущий каталог.... тогда как Вы будете файлы открывать, если путь точно не прописан?

Вернуться в Вопросы программирования в C++Builder