Рандомное создание файла

ребят подскажите пожалуйста что не так делаю, нужно чтобы файл создавался с рандомными именами, а он создается с одним именем, вот код

#include <time.h>
#include <fstream>
#include <windows.h>

int main()
{
    const char* filename[] = {"a.txt","b.txt","c.txt","d.txt","e.txt"};
    FILE* f;
    f = fopen(*filename, "wt");
    srand(time(NULL));
    rand()% sizeof(&filename[rand()]);

return 0;
}

Fesss, надо сначала вычислить рандомное имя, а потом открывать файл. Сейчас у тебя написано fopen(*filename, "wt"), что равносильно fopen(filename[0], "wt"). Поэтому всегда открывается файл «a.txt».

Кроме того, выражение rand()% sizeof(&filename[rand()]) ничего полезного не делает, поскольку его результат не используется. Но оно ещё может и вызывать падение программы, если компилятор его не удалит при оптимизации.

И с заголовочными файлами напутал.

Так будет работать:

#include <cstdio>
#include <cstdlib>
#include <time.h>

int main()
{
    srand(static_cast<unsigned int>(time(NULL)));

    const char* filename[] = { "a.txt", "b.txt", "c.txt", "d.txt", "e.txt" };
    int index = rand() % (sizeof(filename) / sizeof(*filename));

    printf("index = %d  filename = %s\n", index, filename[index]);  // тестовая печать

    FILE* f;
    f = fopen(filename[index], "wt");
    fclose(f);

    system("pause");
    return 0;
}

Спасибо, я как-то не подумал об этом. Зато пришла идея заменить эту запись
const char* filename[] = { «a.txt», «b.txt», «c.txt», «d.txt», «e.txt» }; на алфавит из списка из 27 букв, такое возможно? Иначе такая запись увеличится в разы, а так ф-ция rand() сама будет вытаскивать из алфавита нужные строки. Это вообще реально?

Fesss, (1) английский (латинский) алфавит состоит всего из 26 букв.
(2) Самая примитивная реализация твоей идеи:

#include <cstdio>
#include <cstdlib>
#include <time.h>

const int CHARS_PER_ABC = 26;
char filename_template[] = "-.txt";

int main()
{
    srand(static_cast<unsigned int>(time(NULL)));

    int char_num = rand() % CHARS_PER_ABC;
    filename_template[0] = 'a' + static_cast<char>(char_num);

    printf("filename = %s\n", filename_template);

    FILE* f;
    f = fopen(filename_template, "wt");
    fclose(f);

    system("pause");
    return 0;
}

Я имел ввиду чтобы генерируемое имя было хотя бы из 5 случайных букв. Это думаю интересней будет тем что имена постоянно меняются.

Делается по тому же принципу. Только в шаблоне имени файла резервируется место под 5 символов, а заполняется в цикле.

// не получается как вы говорите, создаются два файла один с одной буквой а другой с такой же
// буквой только вместе с расширением

#include <cstdio>
#include <cstdlib>
#include <time.h>

const int CHARS_PER_ABC = 26;
char filename_template[6] = "-.txt";

int main()
{
    for(int i = 0; i < 6; i++)
    {
        srand(static_cast<unsigned int>(time(NULL)));

        int char_num = rand() % CHARS_PER_ABC;
        i[filename_template] = 'a' + static_cast<char>(char_num);

        printf("filename = %s\n", filename_template);

        FILE* f;
        f = fopen(filename_template, "wt");
        fclose(f);
    }

    return 0;
}

Уважаемый Fesss, вы ни хрена не понимаете, что вы делаете. Настоятельно рекомендую взять книгу по C++ и изучить, для начала, базовые конструкции языка и типы данных. А эта задача пусть будет для вас домашним заданием. Удачи!

Зачем так грубо говорите, вы же сами написали резервируется место, а потом написали в цикле, я сделал. Я поинтересовался невзначай а вы грубить стали

Fesss, нормально вам объясняют и никто вам не грубил.
Просто

i[filename_template]

Наводит на определённые мысли.

Блин.. Не заметил что скопировал, это у меня с экспериментов осталось. Согласен глупость написал. Хорошо бы прокомментировать строчки в коде, некоторые записи мне не понятны.

srand нужно вынести перед циклом.
i[filename_template] нужно заменить filename_template[0], не зря же он char :)
i не будет использоваться, поскольку эта переменная нужна лишь для количества итераций цикла, не более.

Вот исправленный код с комментариями:

//Переписанно с использованием потокового ввода\вывода

#include <iostream>
#include <fstream>
#include <ctime>
#include <cstdlib>

//Количество символов в алфавите, если я правильно понял
const int CHARS_PER_ABC = 26;

//Имя создаваемого файла. char потому что изменяется.
char filename_template[] = "-.txt";

int main()
{
    //"Разгоняем" генератор случайных чисел
    std::srand( static_cast<unsigned int>( std::time( NULL ) ) );

    //Выполнить 6 раз
    for ( int i = 0; i < 6; i++ )
    {
        //Код полученного случайного символа, генерируется при помощи ф-ции rand
        int char_num = std::rand() % CHARS_PER_ABC;

        //Меняем в имени файла первый символ на случайную букву
        //Преобразование обязательно, иначе "а" преобразуется в int, и результат не влезет в filename_template[0]
        filename_template[0] = 'a' + static_cast<char>(char_num);

        //Вывод имени файла
        std::cout << "filename = " << filename_template << std::endl;

        //Создание файла
        std::ofstream f( filename_template, std::ios::out | std::ios::trunc );
        f.close();

    }

    //system("pause");
    return 0;
}

Но этот код делает не то, что вам надо. А вот то, что вам надо вы сделаете сами, после того как прочтёте какую-нибудь книгу, например Как программировать на C++ — Дейтел Х., Дейтел П.. Иначе писать код за вас смысла нет. ;)

Спасибо большое за комментарии в программе, но ваш код неисправен. Создается шесть файлов с разными буквами. Нужно чтобы создавался 1 файл и имя было рандомное из 6 букв. static_cast интересная запись, не изучал его.

Код я уже написал, мне стало интересно почему он не работал, не более того.

но ваш код неисправен

Я писал:

А вот то, что вам надо, вы сделаете сами, после того как прочтёте какую-нибудь книгу...

ಠ_ಠ

почему он не работал

Потому что вы не то написали. Вы написали реализацию

Создается шесть файлов с разными буквами

А хотите:

чтобы создавался 1 файл и имя было рандомное из 6 букв

Читал книгу. Скорее бы уже понять все концепции чтобы тоже начать выебываться перед новичками, а то заебался уже.

porshe, кстати зачем ты все время подключал пространство имен? Не проще ли using namespace std подключить?

начать выебываться перед новичками, а то заебался уже

Ой, как грубо ;)

  1. Книга — «С++ за 21 день: Специальное издание — без упражнений»?
  2. Где мы (я и Cranium) выпендривались? Разве мы не старались вам помочь? Вся проблема в том, что кто-то не знает (не хочет вспомнить) основы программирования на С++, в упор делает то, что он хочет и вместо постижения истины, занимается копированием кода без понимания принципов того, как он работает.
  3. Я сам не далеко ушёл от стадии «новичок», скорее всего ещё даже не ушёл. Так что разница вас со мной невелика.

Не проще ли using namespace std подключить?

Использование using namespace — плохой стиль программирования. У тех же Дейтелов, вроде, написано. Стараюсь оформлять свой код так, как это рекомендованно.

все время подключал пространство имен

Не подключал, а указывал. Подключение это как раз using namespace.

P.S.:

Скорее бы уже

ИМХО, в этом вся проблема.

Внимание! Это довольно старый топик, посты в него не попадут в новые, и их никто не увидит. Пишите пост, если хотите просто дополнить топик, а чтобы задать новый вопрос — начните новый.

Ответить

Вы можете использовать разметку markdown для оформления комментариев и постов. Используйте функцию предпросмотра для проверки корректности разметки.

Пожалуйста, оформляйте исходный код в соответствии с правилами разметки. Для того, чтобы вставить код в комментарий, скопируйте его в текстовое поле ниже, после чего выделите то, что скопировали и нажмите кнопку «код» в панели инструментов. Иначе ваш код может принять нечитаемый вид.

Либо производите оформление кода вручную, следующим образом:

``` #include <iostream> using namespace std; int main() { // ... } ```

Предпросмотр сообщения

Ваше сообщение пусто.