Вывести из файла рандомную строку

Обновлено: 04.07.2024

Здравствуйте, нужна помощь:
В Borlad C++ Builder(6-ой версии) нужно из текстового файла рандомно вытащить строку. пишу:

Ругается на выделенные строки. Прошу указать мне путь истинный!

я тоже матюкнулся, когда это увидел.
для начала выкинь this.
randomize перенеси в такое место, где он выполнится 1 раз при старте программы.
замени это

Расскажу я вам, дружочки, как выращивать грибочки: нужно в поле утром рано сдвинуть два куска урана.

Спасибо за ответ, убрал this, ругается на new. В остальном все должно быть правильно.

текст ошибки где?
С++ чувствителен к регистру символов.

Расскажу я вам, дружочки, как выращивать грибочки: нужно в поле утром рано сдвинуть два куска урана.

Спасибо, с этим разобрался. Есть еще один вопрос: Как можно сделать switch по ListBox'у? Или лучше просто через цикл прогнать с кучей if'ов?
Собственно, у меня есть ListBox с именами файлов и файлы из которых я вытаскиваю по строке. И нужно по соответствию с именем вытаскивать из определенного файла строку.

Спасибо, с этим разобрался. Есть еще один вопрос: Как можно сделать switch по ListBox'у? Или лучше просто через цикл прогнать с кучей if'ов?
у меня есть ListBox с именами файлов и файлы из которых я вытаскиваю по строке. И нужно по соответствию с именем вытаскивать из определенного файла строку.

мож проще вытащить всю инфу один раз и сохранить в отдельный файл?
чо ваще у тебя за задача-то?

Расскажу я вам, дружочки, как выращивать грибочки: нужно в поле утром рано сдвинуть два куска урана.

Генератор стихов. Есть общий пул вопросов типа "Кто?", "Что?", "Что делает?", из них выбираются определенные и в соответствии с этими вопросами, из файлов с ответами на вопросы, вытаскиваются слова, образуя строчку "четверостишия". Затем то же самое на остальных строках, но с проверкой количества глассных в строке и окончания(чтоб совпадали).

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

cout << "Введите полное имя файла *.txt со строками" << endl
<< "Например: C:\\Users\\t.txt" << endl;
string way;
getline(cin, way);
ifstream fin(way);
vector < string > read;
if (fin)
for (;fin;)
string temp;
getline(fin, temp);
read.push_back(temp);
>
read.pop_back();
cout << "Случайно взятая строка из файла *.txt" << endl
<< read[rand() % read.size()] << endl;
>
else
cout << "Указанный файл *.txt не удалось открыть" << endl;
>


system("pause");
return 0;
>

Почитай про стандартные методы работы с файлами. Открытие, закрытие, считывание из файла строки и далее делай что нужно. Разбивай по пробелам и заноси в массив, потом генерируй рандомное число в диапазоне от 0 до количества слов, на которые разбилась строка. Вот и выводи рандомное слово через рандомную генерацию индекса. Осталось написать все методы по отдельности.

Есть такая функция strchr(const char *s, int c) - она ищет вхождение символа c в строке s и возвращает указатель на найденный символ или NULL если он не найден . На ее основе можно делать разбивку строки на отдельные слова:

//Возвращает указатель на первый символ строки, который не является
//пробелом, табуляцией или еще чем-то подобным, т. е. представляет
//собой начало слова.
//По указателю *next записывает указатель на первый символ после
//окончания слова или NULL если такого символа нет
char*get_word( char* str, char** next )
char*first;
char*ptr;

ptr = str;
*next = NULL;
while( *ptr )
//Байт по указателю *ptr является пробелом?
if( strchr( BLANK_CHAR, *ptr ) )
//Да - необходимо перейти на следующий байт
ptr++;
>
else
//Нет - завершаем цикл
break;
>
>

//Сохраним начало слова
first = ptr;
//Теперь найдем окончание слова
if( *ptr )
while( *ptr )
//Байт по указателю *ptr не является пробелом?
if( !strchr( BLANK_CHAR, *ptr ) )
//Да
ptr++;
>
else
//Нет - завершаем цикл
break;
>
>
//Проверим, почему завершился цикл
if( *ptr )
//Мы остановились потому что нашли пробел
//Терминируем слово
*ptr = '\0';
//Перейдем на следующий символ
ptr++;
//Если это не конец строки, то вернем указатель
//на следующий символ
if( *ptr )
*next = ptr;
>
>
>

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

@4ip через Ресурс - мешать строки.
Или читать файл в список, найти рандомное значение от 0 до список.length, и по этому индексу выбирать элемент списка.


Или читать файл в список, найти рандомное значение от 0 до список.length, и по этому индексу выбирать элемент списка.

Зачем такие сложности когда можно просто взять случайный элемент из списка?

alt text

@bigorat Спасибо. Похоже что это хороший вариант. Только там я не могу подключить ресурс, текстовый файл. А только переменную.

Мне с начала текстовый файл занести в переменную?

@bigorat мне в коде проще, чем с кубиками.


@4ip ну вам выше @senerg написал же, можно просто брать случайную строку из ресурса, установив галку "мешать строки" ну и если нужна каждый раз новая строка то с опцией "notreuse". Таки образом будет ресурс как список утрировано :)


Или читать файл в список, найти рандомное значение от 0 до список.length, и по этому индексу выбирать элемент списка.

Прошу прощения. Как это реализовать без кубиков?


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


Опять выше "Советчики". В ресурсе ставишь галку "МЕШАТЬ СТРОКИ". Дальше действие - установить переменную - из ресурса (твоего TXT). Каждый раз в переменной будет рандомная строка.

Зачем такие сложности когда можно просто взять случайный элемент из списка?

Перенес список строчек из текстового файла в переменную, выбирал потом случайную строку из этой переменно, то не работает.

Я думал, вы все эти действия в коде предлагаете сделать

Все, кроме получения файла. Его, конечно тоже можно скопировать из кубика, но там сложно потом будет что-либо поменять.

У меня обычно выбором элемента дело не заканчивается и дальше идет еще какая-то логика. Поэтому для меня в коде проще.

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

0_1542293857631_Screenshot_3.jpg

@bigorat Вот я подключил список, а как потом вызывать от сюда рандомную строку.

@4ip Я же написал выше две строчки, вставьте их в код, замените [[LIST]] на ваш список и перемешивайте сколько угодно раз.

@senerg Спасибо, а как мне добавить этот код в список. И передать рандомную строчку в переменную?

[[LIST]] - сюда я могу вставить название списка из ресурса (текстовый файл). Или из переменной, куда я их загнал через Читать файл в список.


Пренебрегать добровольной бесплатной помощью? Чтож будь по вашему.

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

0_1542294544442_801821ad-8e62-4165-b551-7ab7f4459863-изображение.jpg

Устанавливаете ресурс:

Можете установить "успешных использований" больше.

0_1542294632173_47ddee8b-45ab-455f-87c3-e75066206084-изображение.jpg

А в цикле указываете устанавливаете переменную с ресурсом, без галочки "Повторное использование"

@fox Благодарю.
Смотрите, у меня следующая ситуация. У меня к примеру есть 10 URL адресов, и нужно рандомно открывать их и выполнять на них действия. К примеру чтобы в целом нужно открыть все урлы где-то 50 раз. А с reuse я так понимаю каждый адрес будет использоваться только 1 раз.


@fox Благодарю.
Смотрите, у меня следующая ситуация. У меня к примеру есть 10 URL адресов, и нужно рандомно открывать их и выполнять на них действия. К примеру чтобы в целом нужно открыть все урлы где-то 50 раз. А с reuse я так понимаю каждый адрес будет использоваться только 1 раз.

Указываете "успешных использований" 50, и каждая ссылка будет открываться 50 раз.

На этом уроке мы рассмотрим реализацию рандомного файлового ввода/вывода в языке С++.

Файловый указатель

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

Рандомный доступ к файлам с помощью функций seekg() и seekp()

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

Функции seekg() и seekp() принимают следующие два параметра:

первый параметр — это смещение на которое следует переместить файловый указатель (измеряется в байтах);

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

Флаги ios, которые принимают функции seekg() и seekp() в качестве второго параметра:

beg — cмещение относительно начала файла (по умолчанию);

cur — cмещение относительно текущего местоположения файлового указателя;

end — смещение относительно конца файла.

Положительное смещение означает перемещение файлового указателя в сторону конца файла, тогда как отрицательное смещение означает перемещение файлового указателя в сторону начала файла. Например:

Читайте также: