Fesss, надо сначала вычислить рандомное имя, а потом открывать файл. Сейчас у тебя написано fopen(*filename, "wt"), что равносильно fopen(filename[0], "wt"). Поэтому всегда открывается файл «a.txt».
Кроме того, выражение rand()% sizeof(&filename[rand()]) ничего полезного не делает, поскольку его результат не используется. Но оно ещё может и вызывать падение программы, если компилятор его не удалит при оптимизации.
Спасибо, я как-то не подумал об этом. Зато пришла идея заменить эту запись
const char* filename[] = { «a.txt», «b.txt», «c.txt», «d.txt», «e.txt» }; на алфавит из списка из 27 букв, такое возможно? Иначе такая запись увеличится в разы, а так ф-ция rand() сама будет вытаскивать из алфавита нужные строки. Это вообще реально?
Делается по тому же принципу. Только в шаблоне имени файла резервируется место под 5 символов, а заполняется в цикле.
Fesss
// не получается как вы говорите, создаются два файла один с одной буквой а другой с такой же
// буквой только вместе с расширением
#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
Зачем так грубо говорите, вы же сами написали резервируется место, а потом написали в цикле, я сделал. Я поинтересовался невзначай а вы грубить стали
Fesss, нормально вам объясняют и никто вам не грубил.
Просто
i[filename_template]
Наводит на определённые мысли.
Fesss
Блин.. Не заметил что скопировал, это у меня с экспериментов осталось. Согласен глупость написал. Хорошо бы прокомментировать строчки в коде, некоторые записи мне не понятны.
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++ — Дейтел Х., Дейтел П.. Иначе писать код за вас смысла нет. ;)
Fesss
Спасибо большое за комментарии в программе, но ваш код неисправен. Создается шесть файлов с разными буквами. Нужно чтобы создавался 1 файл и имя было рандомное из 6 букв. static_cast интересная запись, не изучал его.
Fesss
Код я уже написал, мне стало интересно почему он не работал, не более того.
начать выебываться перед новичками, а то заебался уже
Ой, как грубо ;)
Книга — «С++ за 21 день: Специальное издание — без упражнений»?
Где мы (я и Cranium) выпендривались? Разве мы не старались вам помочь? Вся проблема в том, что кто-то не знает (не хочет вспомнить) основы программирования на С++, в упор делает то, что он хочет и вместо постижения истины, занимается копированием кода без понимания принципов того, как он работает.
Я сам не далеко ушёл от стадии «новичок», скорее всего ещё даже не ушёл. Так что разница вас со мной невелика.
Не проще ли using namespace std подключить?
Использование using namespace — плохой стиль программирования. У тех же Дейтелов, вроде, написано. Стараюсь оформлять свой код так, как это рекомендованно.
все время подключал пространство имен
Не подключал, а указывал. Подключение это как раз using namespace.
Внимание! Это довольно старый топик, посты в него не попадут в новые, и их никто не увидит. Пишите пост, если хотите просто дополнить топик, а чтобы задать новый вопрос — начните новый.
ребят подскажите пожалуйста что не так делаю, нужно чтобы файл создавался с рандомными именами, а он создается с одним именем, вот код
Fesss, надо сначала вычислить рандомное имя, а потом открывать файл. Сейчас у тебя написано
fopen(*filename, "wt")
, что равносильноfopen(filename[0], "wt")
. Поэтому всегда открывается файл «a.txt».Кроме того, выражение
rand()% sizeof(&filename[rand()])
ничего полезного не делает, поскольку его результат не используется. Но оно ещё может и вызывать падение программы, если компилятор его не удалит при оптимизации.И с заголовочными файлами напутал.
Так будет работать:
Спасибо, я как-то не подумал об этом. Зато пришла идея заменить эту запись
const char* filename[] = { «a.txt», «b.txt», «c.txt», «d.txt», «e.txt» }; на алфавит из списка из 27 букв, такое возможно? Иначе такая запись увеличится в разы, а так ф-ция rand() сама будет вытаскивать из алфавита нужные строки. Это вообще реально?
Fesss, (1) английский (латинский) алфавит состоит всего из 26 букв.
(2) Самая примитивная реализация твоей идеи:
Я имел ввиду чтобы генерируемое имя было хотя бы из 5 случайных букв. Это думаю интересней будет тем что имена постоянно меняются.
Делается по тому же принципу. Только в шаблоне имени файла резервируется место под 5 символов, а заполняется в цикле.
Уважаемый Fesss, вы ни хрена не понимаете, что вы делаете. Настоятельно рекомендую взять книгу по C++ и изучить, для начала, базовые конструкции языка и типы данных. А эта задача пусть будет для вас домашним заданием. Удачи!
Зачем так грубо говорите, вы же сами написали резервируется место, а потом написали в цикле, я сделал. Я поинтересовался невзначай а вы грубить стали
Fesss, нормально вам объясняют и никто вам не грубил.
Просто
Наводит на определённые мысли.
Блин.. Не заметил что скопировал, это у меня с экспериментов осталось. Согласен глупость написал. Хорошо бы прокомментировать строчки в коде, некоторые записи мне не понятны.
srand
нужно вынести перед циклом.i[filename_template]
нужно заменитьfilename_template[0]
, не зря же онchar
:)i
не будет использоваться, поскольку эта переменная нужна лишь для количества итераций цикла, не более.Вот исправленный код с комментариями:
Но этот код делает не то, что вам надо. А вот то, что вам надо вы сделаете сами, после того как прочтёте какую-нибудь книгу, например Как программировать на C++ — Дейтел Х., Дейтел П.. Иначе писать код за вас смысла нет. ;)
Спасибо большое за комментарии в программе, но ваш код неисправен. Создается шесть файлов с разными буквами. Нужно чтобы создавался 1 файл и имя было рандомное из 6 букв. static_cast интересная запись, не изучал его.
Код я уже написал, мне стало интересно почему он не работал, не более того.
Я писал:
ಠ_ಠ
Потому что вы не то написали. Вы написали реализацию
А хотите:
По сути, я повторяю слова Cranium'a :)
Читал книгу. Скорее бы уже понять все концепции чтобы тоже начать выебываться перед новичками, а то заебался уже.
porshe, кстати зачем ты все время подключал пространство имен? Не проще ли using namespace std подключить?
Ой, как грубо ;)
Использование
using namespace
— плохой стиль программирования. У тех же Дейтелов, вроде, написано. Стараюсь оформлять свой код так, как это рекомендованно.Не подключал, а указывал. Подключение это как раз
using namespace
.P.S.:
ИМХО, в этом вся проблема.