Вот версия, которая делает примерно то, что вам нужно, но использует стандартные файловые потоки, а не нестандартную библиотеку zstr, которая здесь не кажется существенной:
#include <iostream>
#include <fstream>
#include <memory>
#include <string>
#include <vector>
using namespace std::string_literals;
int main()
{
constexpr auto fileName = "test.bin";
{
const auto str = "hello world"s;
auto ofs = std::ofstream( fileName, std::ios::binary );
ofs.write( str.data(), str.size() );
} // ofs is closed here by RAII
auto buff = std::vector<char>(100, 'A');
auto ifs = std::ifstream( fileName, std::ios::binary );
ifs.read(buff.data(), buff.size());
std::cout << std::string(buff.data(), buff.data()+11) << '\n';
}
Она выводит hello world
как и ожидалось. Смотрите его в прямом эфире на Coliru .
Примечания:
- Я удалил
auto_ptr
и добавил правильную область видимости. - Я не управляю памятью вручную (
new
/ delete
), что является плохой формой. Вместо этого я использую std::vector
и std::string
. - Я добавил флаг
std::ios::binary
к конструкторам fstream
, чтобы открывать их в двоичном режиме, так как это то, что, по-видимому, вы в конечном итоге хотите сделать. Это может не понадобиться для используемой вами библиотеки zstr. - Я увеличил буфер, как будто я не знаю, что находится в файле. Затем я прочитал из него столько места, сколько выделил. При печати результата я использую «инсайдерские знания», что существует 11 действительных байтов. Альтернативой было бы инициализировать вектор для всех нулей (по умолчанию) и просто напечатать его в виде строки:
auto buff = std::vector<char>( 100 );
auto ifs = std::ifstream( fileName, std::ios::binary );
ifs.read(buff.data(), buff.size() - 1); // Keep one zero for null terminator
std::cout << buff.data() << '\n';
, которую вы также можете увидеть вживую на Coliru .
Я также модернизировался несколькими другими способами просто для забавы и в образовательных целях:
- Я использую
constexpr
для константы, известной во время компиляции. - Я использую строковый литерал
s
в str
для создания std::string
с большей краткостью. - Я использую стиль ' почти всегда автоматически ' для объявлять объекты.
- Использовать
\n
вместо std::endl
, потому что вам не нужен дополнительный грипп sh (хорошая привычка быть).