Вывести из файла рандомную строку
Обновлено: 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;
>
Есть такая функция 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, и по этому индексу выбирать элемент списка.
Зачем такие сложности когда можно просто взять случайный элемент из списка?
@bigorat Спасибо. Похоже что это хороший вариант. Только там я не могу подключить ресурс, текстовый файл. А только переменную.
Мне с начала текстовый файл занести в переменную?
@bigorat мне в коде проще, чем с кубиками.
@4ip ну вам выше @senerg написал же, можно просто брать случайную строку из ресурса, установив галку "мешать строки" ну и если нужна каждый раз новая строка то с опцией "notreuse". Таки образом будет ресурс как список утрировано :)
Или читать файл в список, найти рандомное значение от 0 до список.length, и по этому индексу выбирать элемент списка.
Прошу прощения. Как это реализовать без кубиков?
Этот код лишь получает случайное число.
Помимо этого ещё нужно получить файл в список и выбрать элемент с индексом значения полученной переменной. Я думал, вы все эти действия в коде предлагаете сделать, но ваше решение подразумевает на один кубик и на одну переменную больше.
Это точно проще?
Опять выше "Советчики". В ресурсе ставишь галку "МЕШАТЬ СТРОКИ". Дальше действие - установить переменную - из ресурса (твоего TXT). Каждый раз в переменной будет рандомная строка.
Зачем такие сложности когда можно просто взять случайный элемент из списка?
Перенес список строчек из текстового файла в переменную, выбирал потом случайную строку из этой переменно, то не работает.
Я думал, вы все эти действия в коде предлагаете сделать
Все, кроме получения файла. Его, конечно тоже можно скопировать из кубика, но там сложно потом будет что-либо поменять.
У меня обычно выбором элемента дело не заканчивается и дальше идет еще какая-то логика. Поэтому для меня в коде проще.
У меня почему-то повторно не запускается скрипт, чтобы перемешать строки в текстовом файле (я ж так понимаю строки перемешиваются при запуске скрипта и подключении ресурса). Поэтому нужно как-то их брать из текстового файла и мешать.
@bigorat Вот я подключил список, а как потом вызывать от сюда рандомную строку.
@4ip Я же написал выше две строчки, вставьте их в код, замените [[LIST]] на ваш список и перемешивайте сколько угодно раз.
@senerg Спасибо, а как мне добавить этот код в список. И передать рандомную строчку в переменную?
[[LIST]] - сюда я могу вставить название списка из ресурса (текстовый файл). Или из переменной, куда я их загнал через Читать файл в список.
Пренебрегать добровольной бесплатной помощью? Чтож будь по вашему.
Как можно сделать рандомный выбор строик. К примеру у меня есть подключенный текстовый файл, со списком URL адресов, и нужно чтобы в переменную загонять рандомную строку из текстового файла. Как это можно сделать?
Устанавливаете ресурс:
Можете установить "успешных использований" больше.
А в цикле указываете устанавливаете переменную с ресурсом, без галочки "Повторное использование"
@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 — смещение относительно конца файла.
Положительное смещение означает перемещение файлового указателя в сторону конца файла, тогда как отрицательное смещение означает перемещение файлового указателя в сторону начала файла. Например:
Читайте также: