Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.85/13: Рейтинг темы: голосов - 13, средняя оценка - 4.85
0 / 0 / 0
Регистрация: 22.09.2014
Сообщений: 3

Копирование файла с использованием итераторов

23.09.2014, 00:02. Показов 2665. Ответов 10
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Задание:
Напишите программу, копирующую один файл с целочисленными данными в другой. Используйте для этого потоковые итераторы. Пользователь должен ввести имена обоих файлов. Можно использовать цикл while. В этом цикле, наверное, будут читаться последовательно значения из входного итератора и сразу записываться в выходной, после чего будет производиться инкремент обоих итераторов.
Мое решение:
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
#include <iostream>          // осуществляет ввод с клавиатуры и вовод на экран
#include <fstream>           // для файловых функций (осуществляет и ввод/вывод в/из файл/файла)
#include <process.h>         // для exit()
#include <iterator>
using namespace std;
 
int main()
{
    char NameFile1[20] = {"file1.txt"};
    char NameFile2[20] = {"file2.txt"};
 
    ifstream file1;                             // создать файл с коборого будет происходить считывание
    file1.open(NameFile1);                      // открыть файл
            if(!file1) { cerr << "\nNevozmojno otkrit'"; exit(-1); } // проверка на ошибки
    istream_iterator<char> in(file1);           // входной итератор
    file1.unsetf(std::ios::skipws);       // чтоб не пропускать пробелы
 
    ofstream file_output2;                      // создать выходной файл
    file_output2.open(NameFile2);               // открыть его
            if(!file_output2) { cerr << "\nNevozmojno otkrit' "; exit(-1); } // проверка на ошибки
    ostream_iterator<char> out(file_output2);   // выходной итератор
 
    while(!file1.eof())
    {
        *out=*in;
         in++;
         out++;  // !!!!! вопрос в этом действии если его закоментировать - программа все равно работает!!!
    }
 
    return 0;
}
вопрос вот в чем, непосредственно в цикле копирования "while(!file1.eof())" при комментировании строки out++;
программа все равно выполняется правильно. поясните пожалуйста как ведет себя выходной итератор.
0
Лучшие ответы (1)
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
23.09.2014, 00:02
Ответы с готовыми решениями:

Сортировка вставками с использованием итераторов
Здравствуйте. Прошу помочь с одним заданием. нужно создать последовательность действительных чисел при помощи библиотечного шаблона vector...

Копирование файла, найденного с использованием FINDSTR
Доброго времени суток! Прошу прощения что вопрос не по теме, но не нашел ветки с батниками, надеюсь мне кто-нибудь поможет. Есть...

Вывести результаты сдачи экзаменов из класса "Зачетка" с использованием итераторов
Задание: Класс &quot;Зачетка&quot; в котором есть массив объекта класса экзамен. Вывести данные по результату сдачи экзаменов для работы с объектами...

10
Почетный модератор
7393 / 2639 / 281
Регистрация: 29.07.2006
Сообщений: 13,696
23.09.2014, 00:11
Цитата Сообщение от kvark85 Посмотреть сообщение
вопрос вот в чем, непосредственно в цикле копирования "while(!file1.eof())" при комментировании строки out++;
программа все равно выполняется правильно. поясните пожалуйста как ведет себя выходной итератор.
*out=*in;
Представь, что тут вызывается file_output2>>*in.
Вот так и работает.
0
5499 / 4894 / 831
Регистрация: 04.06.2011
Сообщений: 13,587
23.09.2014, 00:17
Цитата Сообщение от Vourhey Посмотреть сообщение
Представь, что тут вызывается file_output2>>*in.
C++
1
file_output2 << *in
0
Почетный модератор
7393 / 2639 / 281
Регистрация: 29.07.2006
Сообщений: 13,696
23.09.2014, 00:20
alsav22, ну да
0
0 / 0 / 0
Регистрация: 22.09.2014
Сообщений: 3
23.09.2014, 00:29  [ТС]
тогда непонятно почему при простом инкриминировании итератора файла куда производится копирование, не получается переход на следующую позицию. итератор с помощью которого происходит запись нельзя инкриминировать?
0
Почетный модератор
7393 / 2639 / 281
Регистрация: 29.07.2006
Сообщений: 13,696
23.09.2014, 00:35
Цитата Сообщение от kvark85 Посмотреть сообщение
тогда непонятно почему при простом инкриминировании итератора файла куда производится копирование, не получается переход на следующую позицию
Как раз, понятно. Именно, никакого перехода не получается.
Цитата Сообщение от kvark85 Посмотреть сообщение
итератор с помощью которого происходит запись нельзя инкриминировать?
Инкрементировать никто не запрещает. Только ничего не изменится.
1
5499 / 4894 / 831
Регистрация: 04.06.2011
Сообщений: 13,587
23.09.2014, 00:50
Лучший ответ Сообщение было отмечено Ilot как решение

Решение

Цитата Сообщение от kvark85 Посмотреть сообщение
итератор с помощью которого происходит запись нельзя инкриминировать?
Реализация его в студии:
C++
1
2
3
4
ostream_iterator<_Ty, _Elem, _Traits> operator++(int)
{   // pretend to postincrement
    return (*this);
}
А для чтения так:
C++
1
2
3
4
5
6
_Myt operator++(int)
{   // postincrement
    _Myt _Tmp = *this;
    ++*this;
    return (_Tmp);
}
1
0 / 0 / 0
Регистрация: 22.09.2014
Сообщений: 3
23.09.2014, 09:49  [ТС]
спасибо. сам посмотреть реализацию не догадался. теперь понял

Добавлено через 2 часа 13 минут
я отлаживаю программу в QT, там вместо
C++
1
2
3
4
5
6
_Myt operator++(int)
{   // postincrement
    _Myt _Tmp = *this;
    ++*this;
    return (_Tmp);
}
вот что
C++
1
2
3
4
5
6
7
8
9
istream_iterator&
      operator++()
      {
    __glibcxx_requires_cond(_M_ok,
                _M_message(__gnu_debug::__msg_inc_istream)
                ._M_iterator(*this));
    _M_read();
    return *this;
      }
подскажите пожалуйста, как ЭТО работает? где тут происходит инкриминирование итератора?
0
5499 / 4894 / 831
Регистрация: 04.06.2011
Сообщений: 13,587
23.09.2014, 10:19
Цитата Сообщение от kvark85 Посмотреть сообщение
где тут происходит инкриминирование итератора?
Что должно произойти, когда делается инкремент итератора для чтения из файла? Должно произойти чтение из файла:
Цитата Сообщение от kvark85 Посмотреть сообщение
_M_read();
В студии там дальше чтение:
C++
1
2
3
4
5
6
_Myt operator++(int)
{   // postincrement
    _Myt _Tmp = *this;
    ++*this;
    return (_Tmp);
}
При ++*this переход сюда:
C++
1
2
3
4
5
_Myt& operator++()
{   // preincrement
    _Getval();
    return (*this);
}
В _Getval() видим чтение:
C++
1
2
3
4
5
void _Getval()
{   // get a _Ty value if possible
    if (_Myistr != 0 && !(*_Myistr >> _Myval))
    _Myistr = 0;
}
Добавлено через 9 минут
А вот это оператор присваивания у итератора для записи:
C++
1
2
3
4
5
6
7
ostream_iterator<_Ty, _Elem, _Traits>& operator=(const _Ty& _Val)
{   // insert value into output stream, followed by delimiter
    *_Myostr << _Val;
    if (_Mydelim != 0)
    *_Myostr << _Mydelim;
    return (*this);
}
Видим здесь запись, поэтому никакой другой записи, при инкременте этого итератора, быть не должно.
0
Форумчанин
Эксперт CЭксперт С++
 Аватар для MrGluck
8216 / 5047 / 1437
Регистрация: 29.11.2010
Сообщений: 13,453
23.09.2014, 10:21
Если через итераторы, то
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#include <algorithm>
#include <fstream>
#include <iostream>
#include <iterator>
#include <string>
 
int main()
{
    std::string fileIn, fileOut;
    std::cin >> fileIn >> fileOut;
    std::ifstream ifs(fileIn);
    std::ofstream ofs(fileOut);
    if (!ifs || !ofs)
        return 1; // printError, as you like, ...
    std::copy((std::istreambuf_iterator<char>(ifs)), std::istreambuf_iterator<char>(),
              std::ostreambuf_iterator<char>(ofs));
}
Хотя можно сделать и хак
C++
1
2
3
4
5
6
7
8
9
10
#include <cstdlib>
#include <iostream>
#include <string>
 
int main()
{
    std::string fileIn, fileOut;
    std::cin >> fileIn >> fileOut;
    system(std::string("copy " + fileIn + " " + fileOut).c_str());
}
0
5499 / 4894 / 831
Регистрация: 04.06.2011
Сообщений: 13,587
23.09.2014, 10:33
Цитата Сообщение от kvark85 Посмотреть сообщение
подскажите пожалуйста, как ЭТО работает?
А вот как выглядит _M_read() (в mingw):
C++
1
2
3
4
5
6
7
8
9
void _M_read()
{
     _M_ok = (_M_stream && *_M_stream) ? true : false;
     if (_M_ok)
     {
         *_M_stream >> _M_value;
           _M_ok = *_M_stream ? true : false;
     }
}
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
23.09.2014, 10:33
Помогаю со студенческими работами здесь

Как с использованием итераторов в массиве чисел найти количество чисел, меньших за введенное?
Как при помощи итераторов в массиве чисел найти количество чисел, меньших за введенное?

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

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

Копирование с использованием Robocopy
Имеем: два удаленных офиса на обоих концах 100 мегабит гарантированного интернета на обоих концах маршрутизаторы Cisco соеденены...

Копирование массива из структуры с использованием memcpy()
Здравствуйте. Помогите с задачкой. Есть структура. Произвольная. И массив. Например: typedef struct str { double d; char c; ...


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

Или воспользуйтесь поиском по форуму:
11
Ответ Создать тему
Новые блоги и статьи
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост.
Programma_Boinc 28.12.2025
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост. Налог на собак: https:/ / **********/ gallery/ V06K53e Финансовый отчет в Excel: https:/ / **********/ gallery/ bKBkQFf Пост отсюда. . .
Кто-нибудь знает, где можно бесплатно получить настольный компьютер или ноутбук? США.
Programma_Boinc 26.12.2025
Нашел на реддите интересную статью под названием Anyone know where to get a free Desktop or Laptop? Ниже её машинный перевод. После долгих разбирательств я наконец-то вернула себе. . .
Thinkpad X220 Tablet — это лучший бюджетный ноутбук для учёбы, точка.
Programma_Boinc 23.12.2025
Рецензия / Мнение/ Перевод Нашел на реддите интересную статью под названием The Thinkpad X220 Tablet is the best budget school laptop period . Ниже её машинный перевод. Thinkpad X220 Tablet —. . .
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Как объединить две одинаковые БД Access с разными данными
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru