Форум программистов, компьютерный форум CyberForum.ru

Чтение бинарного файла в поток std::ifstream и вывод в другой бинарный файл std::ofstream (создание копии) - C++

Войти
Регистрация
Восстановить пароль
Другие темы раздела
C++ Вызов деструктора для класса в векторе http://www.cyberforum.ru/cpp-beginners/thread1304877.html
Уважаемые знатоки, подскажите по-поводу деструктора класса, а то я совсем запутался вот в такой ситуации: - есть класс - Ship; - от него унаследовано два класса - BigShip, SmallShip; - затем я создаю глобальный вектор указателей на базовый класс - vector<Ship*> Ships(10); - по указателям выделяю память Ships = new BigShip; Ships = new SmallShip;... Ships = new BigShip; И вот нужно ли в...
C++ Дано два одномерных массива размерностью n, сложить сумму этих массивов и найти наибольшее значение Дано два одномерных массива размерностью n, сложить сумму этих массивов и найти наибольшее значение. Решите пожалуйста :) http://www.cyberforum.ru/cpp-beginners/thread1304875.html
Вывести список всех файлов из указанной директории C++
Помогите сделать , в задание нужно Вывести список всех файлов из указанной директории, имена которых не соответствуют шаблону имени 8.3.
Как правильно брать координаты курсора по событию WM_LBUTTONDOWN в x64? C++
Как правильно брать координаты курсора по событию WM_LBUTTONDOWN в x64? В x32 было x=LOWORD(Lparam); y=HIWORD(Lparam);. А в x64 как? По идее HIWORD в 64-хбитном типе - это в котором единица весит 281474976710656. Или нужно старшее слово младшего двойного слова?
C++ Нужно записать две строчки в другом виде http://www.cyberforum.ru/cpp-beginners/thread1304855.html
Всем доброго времени суток, нужно записать две выделенные строчки в другом виде, наподобие этих строчек: int sumNeg(int *a, int size) { int tmpSum = 0; for (int i = 0; i < size; ++i) if (*(a + i) < 0)//Операция получения значения переменной, хранящейся по адресу, полученное в скобке tmpSum += *(a + i); return tmpSum; Код программы: #include <iostream>...
C++ Есть ли способ, зная ссылку на класс, использовать его значения без запроса по ссылке? скажем есть 2 класса class ItemList { public: ItemList(); int item; int count; Func*func; } подробнее

Показать сообщение отдельно
Pchel
1 / 1 / 0
Регистрация: 04.11.2012
Сообщений: 26

Чтение бинарного файла в поток std::ifstream и вывод в другой бинарный файл std::ofstream (создание копии) - C++

19.11.2014, 12:40. Просмотров 2658. Ответов 8
Метки (Все метки)

Проверил работу программы на маленькой картинке(744 байт). Все работает. С несколько бОльшими файлами(512КБ) нет.
Суть задачи в том, чтобы считать бинарный файл(например *.exe) в поток, сохранить эту информацию в объект-строку типа std::string и оттуда вывести информацию в новый бинарный файл(фактичекски копию).
P.S. Эта строка будет передаваться в составе HTTP ответа на запрос в качестве контента.(но это не важно)
Наблюдения:На тестах стало понятно что при работе с большими файлами программа не заходит в цикл while. Но при этом if (!is) не срабатывает(значит что то там все-таки есть)
Мысли: Возможно не хватает места в объекте is типа ifstream. Хотя переменной offset я присвоил большое значение. Возможно также, можно считывать бинарный файл порциями(насколько это возможно большими) и выводить его также порционно.
Внимание вопрос знатокам: Что делать?(чтобы побороть задачу выделенную красным)
Советы, мысли, код - всему скажу Спасибо!
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
32
33
#include <string>
#include <fstream>
#include <iostream>
#include <ostream>
#include <bitset>
#include <conio.h>
 
int main()
{
 
        std::string full_path = "C:\\x.jpg";
        long long int offset = 1024 * 1024 * 1024 + 10;
        std::ifstream is;
        is.open(full_path.c_str(), std::ios::in | std::ios::binary);//ios::binary - бинарное открытие,ios::in - операции ввода
        is.seekg(offset, std::ios::beg);
        if (!is)
        {
            std::cout << "Файл не найден";
            return 0;
        }
        char buf[512];
        std::string content;
        while (is.read(buf, sizeof(buf)).gcount() > 0)//если количество символов, прочтенных при последней операции неформатированного ввода >0
        {
            content.append(buf, is.gcount());// то добавляем в строку это кол-во символов.
 
        }
        std::ofstream fout("copy_x.jpg", std::ofstream::binary);// создаём объект класса ofstream для записи и связываем его с файлом 
 
        fout << content;
        fout.close(); // закрываем файл
    
}
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
 
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru