• Познакомьтесь с пентестом веб-приложений на практике в нашем новом бесплатном курсе

    «Анализ защищенности веб-приложений»

    🔥 Записаться бесплатно!

  • CTF с учебными материалами Codeby Games

    Обучение кибербезопасности в игровой форме. Более 200 заданий по Active Directory, OSINT, PWN, Веб, Стеганографии, Реверс-инжинирингу, Форензике и Криптографии. Школа CTF с бесплатными курсами по всем категориям.

Работа С Текстом Файла

  • Автор темы PoMaHaB
  • Дата начала
P

PoMaHaB

Здравствуйте, помогите пожалуйста составить программу, которая бы считывала файл.txt в котором содержатся вопросы тесты и раскинула все эти вопросы на файлы (количество должно совпадать с количеством вопросов, и имя файла должно быть номером вопроса).
У каждого номера вопроса стоит символ "@". Это облегчит работу программы. У меня возникают проблемы с циклом создания множества файлов. Как мне быть?? Помогите пожалуйста. Заранее благодарю..
 
L

lazybiz

Что именно у тебя не получается?
 
P

PoMaHaB

Вообще ничего не получается..
Главный вопрос как написать цикл создания текстовых файлов???
 
L

lazybiz

В общем ты ничего не знаешь и ничего не умеешь так?
 
P

PoMaHaB

Я знаю. Я умею работать с текстом на С++. Просто я новичок в работе с созданием файлов.
Вот например:
Код:
ifstream cin("input.txt"); //Чтение из файла input

for ( ??????? )
{
< поиск символа @ >
ofstream cout(" (имя файла - номер теста из файла input.txt) ");
}
Как создавать разные файлы через циклы?
 
A

artkl

PoMaHaB, держите пример программы, где динамически создаются файлы.
C++:
#include <iostream>
#include <fstream>
#include <vector>
#include <string>
#include <sstream>

int main()
{
// Динамическое создание N файлов
int n;
std::cin >> n;

// Массив потоков, связанных с файлами
std::vector< std::ofstream* > streams(n);

for(int i = 0; i < n; ++i)
{
std::ostringstream s;
s << "File #" << i << ".txt";

streams[i] = new std::ofstream(s.str());
(*streams[i]) << "some text...";
}

// Осовобождение памяти
for(int i = 0; i < n; ++i)
delete streams[i];

return 0;
}
 
R

rrrFer

artkl
че-то тут не чисто.

прототипы ostringstream::str :
string str ( ) const;
void str ( const string & s );
в то время как std::eek:fstream требует char* в качестве аргумента:

А еще, файлы стоит закрывать сразу, когда они становятся ненужными( у вас это в конце первого цикла ). Файл закрывается при вызове деструктора, и в принципе, изменения в нем сохранятся, однако, есть ограничение на количество открытых файлов, накладываемое операционной системой.

Зачем же все так усложнили? - вы работаете одновременно лишь с 1 потоком, но создаете их аж вектор )...
чуть поправил:
Код:
#include <fstream>
#include <sstream>
#include <iostream>
int main(){
int		n, i;
std ::ofstream 
ifst;
std ::cin >> n;

for( i = 0; i < n; ++i ) {
std ::ostringstream 
osst;
osst << "File #" << i << ".txt";
ifst .open( osst .str() .c_str() );
ifst << "some text...";
ifst .close();
}

return 0;
}
хотя, можно еще что-нибудь улучшить :)
 
A

artkl

Зачем же все так усложнили? - вы работаете одновременно лишь с 1 потоком, но создаете их аж вектор
Это просто пример, который демонстрирует работу с несколькими динамически создаваемыми файлами. Потоки сохранил на случай, если к ним потребуется доступ снова (опять же, только в целях демонстрации).

че-то тут не чисто.
В MVC++ переопределен конструктор с типом первого аргумента const std::string& :)

Улучшить можно, например, создав некий диспетчер потоков связанных с файлами, который и контролировал бы их.
 
R

rrrFer

В MVC++ переопределен конструктор с типом первого аргумента const std::string& smile.gif
не скинешь ссылку на информацию об этом?
мне что-то с трудом верится, т.к. "std ::" как бы намекает что пространство имен стандартное, мелкомягкие конешно на все способны, но я даже проверил - у меня ничего в студии не "переопределено" - у меня ваша программа нигде и никак не работает.

Улучшить можно, например, создав некий диспетчер потоков связанных с файлами, который и контролировал бы их.
пояснишь что именно улучшится?
 
A

artkl

не скинешь ссылку на информацию об этом?

В моей студии:

пояснишь что именно улучшится?
Декомпозиция задачи же.
Одну большую задачу разделяю на несколько мелких, в данном случае создаю отдельный модуль для работы с файлами (согласно задаче ТС).
 
R

rrrFer

Декомпозиция задачи же.
Одну большую задачу разделяю на несколько мелких, в данном случае создаю отдельный модуль для работы с файлами (согласно задаче ТС).
дак а чем ваш модуль будет лучше стандартного fstream?
 
A

artkl

А при чем тут fstream? Я не предлагал делать его аналог.

Улучшить можно, например, создав некий диспетчер потоков связанных с файлами, который и контролировал бы их.
Решение задачи (в случае с заданием ТС это подзадача) создания и контроля динамического числа потоков выносится в отдельный модуль программы.

Можно, конечно, свалить все в кучу...
 
R

rrrFer

диспетчер потоков связанных с файлами, который и контролировал бы их.
поясните с какой целью их контролировать?
создаю отдельный модуль для работы с файлами
поэтому и спросил про fstream.
причем если в первой цитате Вы предлагаете контролировать потоки - то в последнем посте - контролировать их число:
создания и контроля динамического числа потоков
мне не принципиален ответ, но МБ я что-то новое узнаю и буду Вам премного благодарен.
 
A

artkl

Вкратце, я предложил вариант с декомпозицией: код в функции main выносим куда-нибудь, создаем абстрацию; ничего нового и особенного.

Простой аналог, задача вычисления корней квадратного уравнения. Мы можем оставить код решения этой задачи в главной функции, вместе с вводом и выводом данных, а может оформить это решение в виде отдельной функции.
 
R

rrrFer

создаем абстрацию; ничего нового и особенного
подскажи что такое абстракция? (ну или что ты имеешь под ней ввиду - это ведь очень широкое понятие).
Простой аналог, задача вычисления корней квадратного уравнения. Мы можем оставить код решения этой задачи в главной функции, вместе с вводом и выводом данных, а может оформить это решение в виде отдельной функции.
всегда есть цель. Я потому и спрашивал выше "пояснишь что именно улучшится?"
ответ "декомпозиция" ИМХО неверен. Декомпозиция - это метод достижения цели, но не цель.
В примере с квадратным уравнением цель - повторное использование кода(что позволяет функция)
"создания и контроля динамического числа потоков выносится в отдельный модуль программы."
назначение модуля, в том, числе и повторное использование кода, но еще и, отчасти, сокрытие реализации за интерфейсом(до появления ООП использовался таки модульный подход и многое там было).
--------
Вопрос сводится к тому, что имеется ввиду под контролем потоков(или числа потоков), зачем это нужно, и где это может нам еще потребоваться(если наша цель - повторное использование кода).
 
Мы в соцсетях:

Обучение наступательной кибербезопасности в игровой форме. Начать игру!