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

Тема в разделе "Общие вопросы по С и С++", создана пользователем PoMaHaB, 29 янв 2012.

  1. PoMaHaB

    PoMaHaB New Member

    Регистрация:
    29 янв 2012
    Сообщения:
    4
    Симпатии:
    0
    Здравствуйте, помогите пожалуйста составить программу, которая бы считывала файл.txt в котором содержатся вопросы тесты и раскинула все эти вопросы на файлы (количество должно совпадать с количеством вопросов, и имя файла должно быть номером вопроса).
    У каждого номера вопроса стоит символ "@". Это облегчит работу программы. У меня возникают проблемы с циклом создания множества файлов. Как мне быть?? Помогите пожалуйста. Заранее благодарю..
     
  2. lazybiz

    lazybiz Well-Known Member
    C\C++ Team

    Регистрация:
    3 ноя 2010
    Сообщения:
    1.344
    Симпатии:
    0
    Что именно у тебя не получается?
     
  3. PoMaHaB

    PoMaHaB New Member

    Регистрация:
    29 янв 2012
    Сообщения:
    4
    Симпатии:
    0
    Вообще ничего не получается..
    Главный вопрос как написать цикл создания текстовых файлов???
     
  4. lazybiz

    lazybiz Well-Known Member
    C\C++ Team

    Регистрация:
    3 ноя 2010
    Сообщения:
    1.344
    Симпатии:
    0
    В общем ты ничего не знаешь и ничего не умеешь так?
     
  5. PoMaHaB

    PoMaHaB New Member

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

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

    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;
    }
     
  7. rrrFer

    rrrFer Well-Known Member
    Команда форума C\C++ Team

    Регистрация:
    6 сен 2011
    Сообщения:
    1.324
    Симпатии:
    36
    artkl
    че-то тут не чисто.
    http://cplusplus.com/reference/iostream/ostringstream/str/
    прототипы ostringstream::str :
    в то время как std::eek:fstream требует char* в качестве аргумента: http://cplusplus.com/reference/iostream/ofstream/ofstream/

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

    Зачем же все так усложнили? - вы работаете одновременно лишь с 1 потоком, но создаете их аж вектор )...
    чуть поправил:
    Код (Text):
    #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;
    }
    хотя, можно еще что-нибудь улучшить :)
     
  8. artkl

    artkl Гость

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

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

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

    rrrFer Well-Known Member
    Команда форума C\C++ Team

    Регистрация:
    6 сен 2011
    Сообщения:
    1.324
    Симпатии:
    36
    не скинешь ссылку на информацию об этом?
    мне что-то с трудом верится, т.к. "std ::" как бы намекает что пространство имен стандартное, мелкомягкие конешно на все способны, но я даже проверил - у меня ничего в студии не "переопределено" - у меня ваша программа нигде и никак не работает.

    пояснишь что именно улучшится?
     
  10. artkl

    artkl Гость

    http://en.cppreference.com/w/cpp/io/basic_.../basic_ofstream
    В моей студии:
    [​IMG]
    Декомпозиция задачи же.
    Одну большую задачу разделяю на несколько мелких, в данном случае создаю отдельный модуль для работы с файлами (согласно задаче ТС).
     
  11. rrrFer

    rrrFer Well-Known Member
    Команда форума C\C++ Team

    Регистрация:
    6 сен 2011
    Сообщения:
    1.324
    Симпатии:
    36
    дак а чем ваш модуль будет лучше стандартного fstream?
     
  12. artkl

    artkl Гость

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

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

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

    rrrFer Well-Known Member
    Команда форума C\C++ Team

    Регистрация:
    6 сен 2011
    Сообщения:
    1.324
    Симпатии:
    36
    поясните с какой целью их контролировать?
    поэтому и спросил про fstream.
    причем если в первой цитате Вы предлагаете контролировать потоки - то в последнем посте - контролировать их число:
    мне не принципиален ответ, но МБ я что-то новое узнаю и буду Вам премного благодарен.
     
  14. artkl

    artkl Гость

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

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

    rrrFer Well-Known Member
    Команда форума C\C++ Team

    Регистрация:
    6 сен 2011
    Сообщения:
    1.324
    Симпатии:
    36
    подскажи что такое абстракция? (ну или что ты имеешь под ней ввиду - это ведь очень широкое понятие).
    всегда есть цель. Я потому и спрашивал выше "пояснишь что именно улучшится?"
    ответ "декомпозиция" ИМХО неверен. Декомпозиция - это метод достижения цели, но не цель.
    В примере с квадратным уравнением цель - повторное использование кода(что позволяет функция)
    "создания и контроля динамического числа потоков выносится в отдельный модуль программы."
    назначение модуля, в том, числе и повторное использование кода, но еще и, отчасти, сокрытие реализации за интерфейсом(до появления ООП использовался таки модульный подход и многое там было).
    --------
    Вопрос сводится к тому, что имеется ввиду под контролем потоков(или числа потоков), зачем это нужно, и где это может нам еще потребоваться(если наша цель - повторное использование кода).
     
Загрузка...
Похожие Темы - Работа Текстом Файла
  1. Andrey Kha
    Ответов:
    0
    Просмотров:
    17
  2. Hoasker
    Ответов:
    0
    Просмотров:
    63
  3. garri671
    Ответов:
    0
    Просмотров:
    50
  4. lelik200969
    Ответов:
    0
    Просмотров:
    49
  5. Kozolick
    Ответов:
    0
    Просмотров:
    135

Поделиться этой страницей