Выбирать строки из файла НЕ перебором

Модераторы: Hawk, Romeo, Absurd, DeeJayC, WinMain

Ответить
РусНекромант
Сообщения: 3
Зарегистрирован: 08 май 2010, 01:53

Ща только начинаю изучать С++ у меня стоит Microsoft Visual Studio 2008 (если это имеет значение). Так вот я раньше писал на VB.6 потом перешел на VB.NET так вот там очень хорошо работалось с текстовыми файлами там есть способ при котором в "правильно" записанном файле можно было написать допустим 44 строчку прочитать и передать переменной. И это все без перебора и прочего что мне предлагают ща учебники С++ для начинающих. Правда и записывать нужно было именно в 44 строку ну тоесть все там круто пишеш что нужно в строки а потом выгребаешь. Так вот в чем вопрос мне что то не верится что в С++ нет чего то подобного насчет ставить сиволы где нада а потом искать и так выделять строку эт конечно круто я смогу но это громоздко и не удобно может есть что то попроще?

P.S. Программа это викторина около 50 вопросов 4 варианта ответа и нада естественно рандомом все это оформить всё в принципе решил осталось только насчёт файла определится тоесть что бы без проблем можно было 5 строк (1 вопрос 4 ответа) считать из файла и подставить. В VB можно было бы цикл с шагом 5 поставить и рандомно начало цикла задать и вот вуаля строки загружены всего 6 строк кода заняло бы. И ещё перейти на VB не предлагать так как у меня условие задания писать на С++
Аватара пользователя
Romeo
Сообщения: 3126
Зарегистрирован: 02 мар 2004, 17:25
Откуда: Крым, Севастополь
Контактная информация:

Готового класса для подобных манипуляций в С++ нет. Тебе придётся его реализовать самому, но это не сложно. Предлагаю следующий подход:

- Конструктор принимает строку - путь к файлу. Он открывает файл на чтение, вычитывает из него данные в любой контейнер строк (например в вектор) и закрывает файл.
- Деструктор открывает файл на запись, сохраняет содержимое внутреннего контейнера в файл и закрывает его.
- Класс также должен иметь методы для модицикации (добавить, удалить, редактировать) строк из внутреннего контейнера.
Entites should not be multiplied beyond necessity @ William Occam
---
Для выделения С++ кода используйте конструкцию [ code=cpp ] Код [ /code ] (без пробелов)
---
Сообщение "Спасибо" малоинформативно. Благодарность правильнее высказать, воспользовавшись кнопкой "Reputation" в виде звёздочки, расположенной в левом нижнем углу рамки сообщения.
Аватара пользователя
Decoder
Сообщения: 308
Зарегистрирован: 19 фев 2008, 23:11
Откуда: Moscow

В Borland C++ Builder есть готовый класс TStringList, у которого есть метод LoadFromFile. Далее просто выбираешь любую строку из полученного массива по индексу.
Поумнеть несложно, куда труднее от дури избавиться.
Аватара пользователя
Romeo
Сообщения: 3126
Зарегистрирован: 02 мар 2004, 17:25
Откуда: Крым, Севастополь
Контактная информация:

Человек пишет под Visual Studio, так что библиотека VCL недоступна :)
Entites should not be multiplied beyond necessity @ William Occam
---
Для выделения С++ кода используйте конструкцию [ code=cpp ] Код [ /code ] (без пробелов)
---
Сообщение "Спасибо" малоинформативно. Благодарность правильнее высказать, воспользовавшись кнопкой "Reputation" в виде звёздочки, расположенной в левом нижнем углу рамки сообщения.
Аватара пользователя
WinMain
Сообщения: 929
Зарегистрирован: 14 янв 2005, 10:30
Откуда: Москва
Контактная информация:

В проекте на VС++ 2008 легко можно включить опцию поддержки CLR и пользоваться объектами платформы .NET с тем же успехом, что и на VB.NET
Объект System.IO.File содержит статический метод ReadAllLines(), который возвращает готовый массив строк. Потом выбирай любую строку из этого массива.
РусНекромант
Сообщения: 3
Зарегистрирован: 08 май 2010, 01:53

Ну может быть тогда не текстовый файл мне всё равно главное не БД так как он потребует что бы при установке программы был установлен SQL сервер а это ни к чему программка маленькая. Допустим файлы XML удобно ли с ними работать и как это делается?
Аватара пользователя
WinMain
Сообщения: 929
Зарегистрирован: 14 янв 2005, 10:30
Откуда: Москва
Контактная информация:

Можно воспользоваться механизмом сериализации, который реализован в библиотеке MFC. Это способность объектов "самосохраняться" при записи данных в файл и "самовосстанавливаться" при чтении из файла. Класс CStringArray (который является динамическим массивом для текстовых строк) тоже обладает этой способностью, поэтому ничего дополнительно писать не придётся. Для этого в процедуре чтения/записи данных нужно будет добавить объект класса CStringArray в поток сериализации.
Если тебя интересует XML, то можно воспользоваться системными библиотеками MSXML или xmllite. Для небольшого набора данных предпочтительнее xmllite, т.к. он проще в использовании.
Ещё проще воспользоваться старым добрым INI-файлом. Для этого тебе понадобятся всего две функции: WritePrivateProfileString() и GetPrivateProfileString().
РусНекромант
Сообщения: 3
Зарегистрирован: 08 май 2010, 01:53

Попробуем)) а насчет Reedline () почемуто русский текст не понимает прога я не пойму толи шрифт не знает толи кодировку не меняет карочь выводит число норм а вместо русских букв квадратики и подобное. Так что это
Ответить