Выбирать строки из файла НЕ перебором
Модераторы: 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 не предлагать так как у меня условие задания писать на С++
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" в виде звёздочки, расположенной в левом нижнем углу рамки сообщения.
---
Для выделения С++ кода используйте конструкцию [ code=cpp ] Код [ /code ] (без пробелов)
---
Сообщение "Спасибо" малоинформативно. Благодарность правильнее высказать, воспользовавшись кнопкой "Reputation" в виде звёздочки, расположенной в левом нижнем углу рамки сообщения.
В 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" в виде звёздочки, расположенной в левом нижнем углу рамки сообщения.
---
Для выделения С++ кода используйте конструкцию [ code=cpp ] Код [ /code ] (без пробелов)
---
Сообщение "Спасибо" малоинформативно. Благодарность правильнее высказать, воспользовавшись кнопкой "Reputation" в виде звёздочки, расположенной в левом нижнем углу рамки сообщения.
В проекте на VС++ 2008 легко можно включить опцию поддержки CLR и пользоваться объектами платформы .NET с тем же успехом, что и на VB.NET
Объект System.IO.File содержит статический метод ReadAllLines(), который возвращает готовый массив строк. Потом выбирай любую строку из этого массива.
Объект System.IO.File содержит статический метод ReadAllLines(), который возвращает готовый массив строк. Потом выбирай любую строку из этого массива.
-
- Сообщения: 3
- Зарегистрирован: 08 май 2010, 01:53
Ну может быть тогда не текстовый файл мне всё равно главное не БД так как он потребует что бы при установке программы был установлен SQL сервер а это ни к чему программка маленькая. Допустим файлы XML удобно ли с ними работать и как это делается?
Можно воспользоваться механизмом сериализации, который реализован в библиотеке MFC. Это способность объектов "самосохраняться" при записи данных в файл и "самовосстанавливаться" при чтении из файла. Класс CStringArray (который является динамическим массивом для текстовых строк) тоже обладает этой способностью, поэтому ничего дополнительно писать не придётся. Для этого в процедуре чтения/записи данных нужно будет добавить объект класса CStringArray в поток сериализации.
Если тебя интересует XML, то можно воспользоваться системными библиотеками MSXML или xmllite. Для небольшого набора данных предпочтительнее xmllite, т.к. он проще в использовании.
Ещё проще воспользоваться старым добрым INI-файлом. Для этого тебе понадобятся всего две функции: WritePrivateProfileString() и GetPrivateProfileString().
Если тебя интересует XML, то можно воспользоваться системными библиотеками MSXML или xmllite. Для небольшого набора данных предпочтительнее xmllite, т.к. он проще в использовании.
Ещё проще воспользоваться старым добрым INI-файлом. Для этого тебе понадобятся всего две функции: WritePrivateProfileString() и GetPrivateProfileString().
-
- Сообщения: 3
- Зарегистрирован: 08 май 2010, 01:53
Попробуем)) а насчет Reedline () почемуто русский текст не понимает прога я не пойму толи шрифт не знает толи кодировку не меняет карочь выводит число норм а вместо русских букв квадратики и подобное. Так что это