Другие языки программирования и технологии
Генератор случайных слов (строк) из файла на C++.
Генератор случайных слов (строк) из файла на C++ .Хочу из файла брать рандомную строку и выводить в строке программы. Помогайте.
#include < iostream >
#include < windows.h >
#include < ctime >
#include < cstdlib >
#include < string >
#include < fstream >
#include < vector >
using namespace std;
int main()
{
SetConsoleCP(1251);
SetConsoleOutputCP(1251);
system("color 0A");
srand(time(0u));
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;
}

#include < windows.h >
#include < ctime >
#include < cstdlib >
#include < string >
#include < fstream >
#include < vector >
using namespace std;
int main()
{
SetConsoleCP(1251);
SetConsoleOutputCP(1251);
system("color 0A");
srand(time(0u));
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;
}
}
}
returnfirst;
}
По ссылке - исходный код программы, который делает подобный разбор: https://pastebin.com/zL4aTrYE Это, кончено, довольно примитивный парсер, но вполне рабочий.
//Возвращает указатель на первый символ строки, который не является
//пробелом, табуляцией или еще чем-то подобным, т. е. представляет
//собой начало слова.
//По указателю *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;
}
}
}
returnfirst;
}
По ссылке - исходный код программы, который делает подобный разбор: https://pastebin.com/zL4aTrYE Это, кончено, довольно примитивный парсер, но вполне рабочий.
чем помочь?
Igor Kravcenko
код бы мне, сам не могу додуматься
Почитай про стандартные методы работы с файлами. Открытие, закрытие, считывание из файла строки и далее делай что нужно. Разбивай по пробелам и заноси в массив, потом генерируй рандомное число в диапазоне от 0 до количества слов, на которые разбилась строка. Вот и выводи рандомное слово через рандомную генерацию индекса. Осталось написать все методы по отдельности.
Похожие вопросы
- Генератор Случайных Чисел
- Генератор случайных чисел на VS C++
- Генератор случайных чисел в Basic или C++
- Нужен bat файл, чтобы переименовал все txt файлы в папке, заменяя имя на первую строку содержимого файла
- Как удалить строку из файла (Visual Basic 6.0)
- как сделать русскую бегущую строку в файле php?
- Создать список из повторяющихся слов текста из файла. Первый элемент-наиб. часто повторяющееся слово/ Паскаль. (+)
- Генератор случайных чисел с равномерным распределением
- Как открыть файл на C++ ?
- bat файл, как с помощью батника заменить строку в файле. txt