Форум программистов, компьютерный форум, киберфорум
C++ Builder
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.65/23: Рейтинг темы: голосов - 23, средняя оценка - 4.65
0 / 0 / 1
Регистрация: 08.11.2008
Сообщений: 86

Рандомно текст с файла

29.04.2009, 17:19. Показов 4565. Ответов 27
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Всем привет.
Пишу icq бота - анекдотчика. Кто может помочь написать функцию которая бы рандомно брала текст с файла anekdot.txt. Анекдоты в файле отделены друг от друга одной или более пустыми строками. Сам анекдот может занимать более одной строки. Пример файла:

------начало файла anekdot.txt------------

[анекдот1]

[анекдот2]


[анекдот3]


[анекдотN]

------конец файла anekdot.txt------------
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
29.04.2009, 17:19
Ответы с готовыми решениями:

Задать рандомно текст кнопок строками из файла
Здравствуйте. Значит, на определенной форме в определенном проекте имеется набор из 10 кнопок таким образом (скрин во вложениях). В...

Как рандомно вывести картинку и текст так, чтобы к определенной картинке относился определенный текст?
Всем привет.Нужна помощь.как рандомно вывести картинку и текст, так чтобы к определенной картинке относился определенный текст???Помогите...

Рандомно создать текст
Как по нажатию кнопки вывести рандомный текст в ТекстБокс?

27
Почетный модератор
 Аватар для Lord_Voodoo
8785 / 2538 / 144
Регистрация: 07.03.2007
Сообщений: 11,873
29.04.2009, 17:54
я бы сделал проще... не текстовый файл, а лучше дбф или xml, тогда проблема сводилась бы только к рандомному обращению к записям
0
0 / 0 / 1
Регистрация: 08.11.2008
Сообщений: 86
29.04.2009, 18:01  [ТС]
Дело в том что у меня анекдоты в файле, и их(анекдотов) очень много. Мне так было бы удобнее и лучше. И новые добавлять удобно
0
Почетный модератор
7393 / 2639 / 281
Регистрация: 29.07.2006
Сообщений: 13,696
29.04.2009, 18:02
Полюбому тебе придется им формат задавать. Иначе будешь все подряд читать и парсить. Можно сделать, как ini-файл, как xml мне вообще предложение нравится. Или свой придумывай и парсинг, соответственно, тоже пиши вручную.
0
0 / 0 / 1
Регистрация: 08.11.2008
Сообщений: 86
29.04.2009, 18:23  [ТС]
Если делать как ini файл , мне придется все анекдоты копировать? Если нет то мне в принципе без разницы. Главное что бы работало.
0
Почетный модератор
 Аватар для Lord_Voodoo
8785 / 2538 / 144
Регистрация: 07.03.2007
Сообщений: 11,873
29.04.2009, 18:26
malik, суть решения вашей проблемы - это структуризация данных, чтобы потом с ними легче было работать...
Если делать как ini файл , мне придется все анекдоты копировать?
а этого просто не понял... вам ваш исходный файл прийдется переделать под выбранную структуру, но это надо будет сделать однократно, а потом и обращение и редактирование будет простым
0
0 / 0 / 1
Регистрация: 08.11.2008
Сообщений: 86
29.04.2009, 18:36  [ТС]
Пример можешь привести как это вообще будет выглядеть ? Сам файл при открытии
0
Почетный модератор
7393 / 2639 / 281
Регистрация: 29.07.2006
Сообщений: 13,696
29.04.2009, 18:47
Например:
Code
1
2
3
4
1; анекдот первый
2; анекдот
второй
3; ...
Рандомно генеришь число и читаешь нужный анекдот. Из обычного текстового файла с помощью ODBC драйвера легко делается таблица БД, что может облегчить решение этой задачи обычным SQL-запросом.
Ну ты ini-файл хоть раз видел? Можно и с его структурой.
0
0 / 0 / 1
Регистрация: 08.11.2008
Сообщений: 86
29.04.2009, 18:55  [ТС]
А можно так сделать?
-
анекдот1
-
анекдот2
-
Анек-
дооо-
ттттт3
-


Если да, то давайте так и сделаем

Добавлено через 1 минуту 50 секунд
Без разницы какой файл ini или db...
0
Почетный модератор
7393 / 2639 / 281
Регистрация: 29.07.2006
Сообщений: 13,696
29.04.2009, 19:08
Зашибись. А как ты будешь их тогда рандомно читать? Если без разницы, то засунь их в бд и по рандомному ID доставай оттуда.
0
0 / 0 / 1
Регистрация: 08.11.2008
Сообщений: 86
29.04.2009, 23:50  [ТС]
Даывай так и сделаем как вы выше предлагали.

1; анекдот первый
2; анекдот
второй
3; ...

Можете написать мне эту функцию?
0
Почетный модератор
7393 / 2639 / 281
Регистрация: 29.07.2006
Сообщений: 13,696
30.04.2009, 00:55
Помочь могу. Делать за других их работу мне не хочется.
0
0 / 0 / 1
Регистрация: 08.11.2008
Сообщений: 86
30.04.2009, 01:01  [ТС]
Дело в том что я не представляю себе этого. Поэтому и обратился к вам.
0
Почетный модератор
7393 / 2639 / 281
Регистрация: 29.07.2006
Сообщений: 13,696
30.04.2009, 01:03
Это понятно. Ну ты можешь построчно читать файл, верно? Вот тебе теперь нужно читать начало строки и проверять там число.
0
0 / 0 / 1
Регистрация: 08.11.2008
Сообщений: 86
30.04.2009, 01:06  [ТС]
Со строками не умею работать.. К сожалению.
0
Почетный модератор
7393 / 2639 / 281
Регистрация: 29.07.2006
Сообщений: 13,696
30.04.2009, 01:11
Ясно. Значит, надо учиться.
0
0 / 0 / 1
Регистрация: 08.11.2008
Сообщений: 86
30.04.2009, 23:05  [ТС]
Если бы я знал как это сделать я бы наверно не обращался к вам ....
Спасибо за помощь
0
 Аватар для mirso
562 / 373 / 55
Регистрация: 05.04.2009
Сообщений: 767
01.05.2009, 00:41
Можно за искомый взять редко встречающийся символ.
К примеру параграф - '§'
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
#include "math.h"
//---------------------------------------------------------------------------
void __fastcall TForm1::FormCreate(TObject *Sender)
{Randomize();    //генератор случайных чисел
 
    if(FileExists("Anekdot's.txt"))//если файл существует открываем
    Memo1->Lines->LoadFromFile("Anekdot's.txt");
 
    for(int i = 0; i < Memo1->Lines->Count; i++)
      Memo1->Lines->Strings[i].Trim();
      //избавляемся от пробелов по бокам
}
//---------------------------------------------------------------------------
//знак § редковато встречается в "анекдотах"
void __fastcall TForm1::SpeedButton1Click(TObject *Sender)
{
int        n;
AnsiString s;//строка для анекдота
 
    do{
      n = random(Memo1->Lines->Count); //Со строками не умею работать.. К сожалению.
      s = Memo1->Lines->Strings[n]; //Малик, это возможно 1 строка анекдота
           //---------------------------
    }while(s > "" && s[1] != '§');  //проверяем! не пусто и не '§' - не она!
    //----------------------------  //елси '§" - первая строка найдена - далее!
 
    while(Memo1->Lines->Strings[++n] != "")//если следующая не пустая
    {
        s += Memo1->Lines->Strings[n];     //прибавляем...  и... вся функция!
    }//-------------- return (s);---------------------------
 
    Label1->Caption = "Анекдот!\n";       //начало вывода
 
    for(int i = 2; i < s.Length(); i++)   //можно сделать выплывающий текст
    {
      Sleep(40);//неспеша, начиная со второго символа, пропуская '§'
      Label1->Caption = Label1->Caption + s[i]; 
      Application->ProcessMessages();           //нетормозя остальное
    }
}
//---------------------------------------------------------------------------
 
void __fastcall TForm1::FormClose(TObject *Sender, TCloseAction &Action)
{
    Memo1->Lines->SaveToFile("Anekdot's.txt");//сохраняем
}
//---------------------------------------------------------------------------
Файл "*.txt" можно создать в процессе выполнения приложения.
Можно функцию добавить, что бы '§' добавлялся автоматически s.Insert("§",1);

Вместо § - что угодно можно - <555>, ◄► '‼'.
Миниатюры
Рандомно текст с файла  
1
0 / 0 / 1
Регистрация: 08.11.2008
Сообщений: 86
02.05.2009, 16:52  [ТС]
Дали мне эту функцию , которая с текста выделяет анекдоты, только на Borland Delphi. Кто может помочь переписать на С++ ???

Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
function countAnekdotes( file_path : string ) : integer;
var
    f : textfile;
    s, s2 : string;
begin
    assignfile( f, file_path );
    {$I-}
        reset( f );
    {$I+}
    Result := 0;
    if ( IOResult <> 0 ) then exit;
    
    s := '';
    while ( not EOF( f ) ) do
    begin
        readln( f, s2 );
        if ( s2 = '' ) then
        begin
            if ( s <> '' ) then
            begin
                inc( Result );
                s := '';
            end;
        end
        else
        begin
            s := s + #13#10 + s2;
        end;
    end;
 
    if ( s <> '' ) then inc( Result );
    
    closefile( f );
end;
 
function getAnekdot( file_path : string; totalCount : integer ) : string;
var
    f : textfile;
    s, s2 : string;
begin
    assignfile( f, file_path );
    {$I-}
        reset( f );
    {$I+}
    if ( IOResult <> 0 ) then begin Result := ''; exit; end;
    
    totalCount := random( totalCount ) + 1;
 
    Result := '';
    
    s := '';
    while ( not EOF( f ) ) do
    begin
        readln( f, s2 );
        if ( s2 = '' ) then
        begin
            if ( s <> '' ) then
            begin
                dec( totalCount );
                if ( totalCount = 0 ) then begin Result := s; exit end;
                s := '';
            end;
        end
        else
        begin
            if ( s <> '' ) then    s := s + #13#10 + s2
            else                s := s2;
        end;
    end;
 
    if ( s <> '' ) then Result := s;
    
    closefile( f );
end;
 
count := countAnekdotes( path+'\text\anekdots.txt' );
Atext := getAnekdot( path+'\text\anekdots.txt', count );
Добавлено через 4 часа 55 минут 14 секунд
Спасибо Monte-Cristo за перевод
Вот, если кому в будущем понадобится:

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
#include <iostream>
#include <cstdlib>
#include <ctime>
using namespace std;
 
char res[1024];
/////////////////////////////////////////////////////////////////
int countAnekdotes(const char *file_path)
{
    const int size = 255;
    char s[size];
    int res = 0;
 
 
    FILE *f = fopen(file_path, "rt");
    
    if (!f) return 0;
    
    while (!feof(f))
    {
        fgets(s, size, f);
        if ( s[0] == '\n' ) res++;
    }
    
    fclose(f);
    
    return res;
}
/////////////////////////////////////////////////////////////////
void getAnekdot(const char* file_path, int totalCount )
{
    const int size = 255;
    char s[size];
    int count = 0;
    int n;
 
    FILE *f = fopen(file_path, "rt");
    
    if (!f) exit(0);
 
    memset(res, 0, 1024);
 
    srand(time(0));
 
    n = rand()%totalCount;
 
    while (count != n)
    {
        fgets(s, size, f);
        if ( s[0] == '\n' ) count++;
    }
 
    fgets(s, size, f);
    while (s[0] != '\n')
    {
        strcat(res, s);
        fgets(s, size, f);
    }
  
    fclose(f);
}
/////////////////////////////////////////////////////////////////
int main()
{
    getAnekdot("na.txt", countAnekdotes("na.txt"));
    cout << res;
 
        return 0;
}
0
 Аватар для mirso
562 / 373 / 55
Регистрация: 05.04.2009
Сообщений: 767
02.05.2009, 23:38
Сократил, до примерно следующего

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
//-------------------------------------------------------
#include <iostream.h>
#include <fstream.h>
#include <string.h>
#include <windows.h>
 
//------------------------------
string getAnt(const char* fname)
{
string ant[1001];
char line[1024];
int rmax, rx;
 
    ifstream allf(fname);
    for(int i = 0; allf.getline(line, sizeof(line)); i++)
    { CharToOem(line, line);
      ant[i] = line;
      rmax = i;
    }
    allf.close();
    //----------------
    srand(time(0)); //почему работает без  <stdlib.h>?
    rx = random(rmax);
    //----------------
    return (ant[rx]);
}
//---------------------------
 
void main(void)
{
    cout  << getAnt("Anekdot's.txt") << endl;
    system("pause");
}
//------------------------------------------------------
В консоли, после анекдота пишется:"для продолжения нажмите любую клавишу... ".
Подскажите, избавиться от этой надписи можно?

И так понятно, что нажмут.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
02.05.2009, 23:38
Помогаю со студенческими работами здесь

Рандомно менять текст на 4-х кнопках
Здравствуйте! Есть 4 кнопки: Button2.Text = random.Next(2, 5).ToString(); Button3.Text = random.Next(6,...

Как можно сделать, что бы текст отправлялся рандомно?
Доброго времени суток. Искал, гуглил, но ничего дельного не нашел. В общем, делаю флудер простенький, и вот хотелось бы узнать,...

Шифратор зашифровывает текст в файле в виде китайских символов, а надо рандомно латиницей
Написал программу по зашифровке файла. Всё отлично, но зашифровывает текст в файле в виде китайских символов, а надо рандомно латиницей....

Из файла А переместить текст в файл В, записав текст из файла А в обратном порядке
Условие: Из файла А переместить текст в файл В, записав текст из файла А в обратном порядке ( зеркально). В чем проблема, выводит на...

Рандомно выводить из текстового файла строку
В общем-то, задача заключается в том, чтобы рандомно выводить из текстового файла строку. В Паскале осуществить получилось, а вот в Делфи...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
Программный контроль заполнения реквизита табличной части документа
Maks 02.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "СписаниеМатериалов", разработанного в конфигурации КА2. Задача: реализовать контроль заполнения реквизита "ПричинаСписания". . .
wmic не является внутренней или внешней командой
Maks 02.04.2026
Решение: DISM / Online / Add-Capability / CapabilityName:WMIC~~~~ Отсюда: https:/ / winitpro. ru/ index. php/ 2025/ 02/ 14/ komanda-wmic-ne-naydena/
Программная установка даты и запрет ее изменения
Maks 02.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "СписаниеМатериалов", разработанного в конфигурации КА2. Задача: при создании документов установить период списания автоматически. . .
Вывод данных в справочнике через динамический список
Maks 01.04.2026
Реализация из решения ниже выполнена на примере нетипового справочника "Спецтехника" разработанного в конфигурации КА2. Задача: вывести данные из ТЧ нетипового документа. . .
Программное заполнения текстового поля в реквизите формы документа
Maks 01.04.2026
Алгоритм из решения ниже реализован на нетиповом документе "ВыдачаОборудованияНаСпецтехнику" разработанного в конфигурации КА2, в дополнении к предыдущему решению. На форме документа создается. . .
К слову об оптимизации
kumehtar 01.04.2026
Вспоминаю начало 2000-х, университет, когда я писал на Delphi. Тогда среди программистов на форумах активно обсуждали аккуратную работу с памятью: нужно было следить за переменными, вовремя. . .
Идея фильтра интернета (сервер = слой+фильтр).
Hrethgir 31.03.2026
Суть идеи заключается в том, чтобы запустить свой сервер, о чём я если честно мечтал давно и давно приобрёл книгу как это сделать. Но не было причин его запускать. Очумелые учёные напечатали на. . .
Модель здравосоХранения 6. ESG-повестка и устойчивое развитие; углублённый анализ кадрового бренда
anaschu 31.03.2026
В прикрепленном документе раздумья о том, как можно поменять модель в будущем
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru