Boost библиотека iostream :: копирование не работает

#include <fstream>
#include <iostream>
#include <boost/iostreams/filtering_streambuf.hpp>
#include <boost/iostreams/copy.hpp>
#include <boost/iostreams/filter/bzip2.hpp>

int main()
{
using namespace std;
using namespace boost::iostreams;

ifstream file("gcc-4.7.2.tar.bz2", ios_base::in | ios_base::binary);
filtering_streambuf<input> in;
in.push(bzip2_decompressor());
in.push(file);
boost::iostreams::copy(in, cout);

system("pause");
return 0;
}

Я установил Boost как в этом вопросе:
Как использовать Boost в Visual Studio 2010 ?

И я получаю ошибку на boost::iostreams::copy(in, cout) заявление.

Я очень новичок в Boost, поэтому я не знаю, правильный ли этот код или неправильный.

Я думаю, что сделал все, что должен, и я потерян.


РЕДАКТИРОВАТЬ

Я проверил этот вопрос: исключения из boost :: iostreams :: copy () .

И я изменил свой тестовый код, чтобы знать, какую ошибку я получаю.

#include <fstream>
#include <iostream>
#include <boost/iostreams/filtering_streambuf.hpp>
#include <boost/iostreams/copy.hpp>
#include <boost/iostreams/filter/bzip2.hpp>

int main()
{
using namespace std;
using namespace boost::iostreams;

try {
ifstream file("hello.bz2", ios_base::in | ios_base::binary);
filtering_streambuf<input> in;
in.push(bzip2_decompressor());
in.push(file);
boost::iostreams::copy(in, cout);
}
catch(const bzip2_error& exception) {
int error = exception.error();

if(error == boost::iostreams::bzip2::data_error) {
// compressed data stream is corrupted
cout << "compressed data stream is corrupted";
}
else if(error == boost::iostreams::bzip2::data_error_magic)
{
// compressed data stream does not begin with the 'magic' sequence 'B' 'Z' 'h'
cout << "compressed data stream does not begin with the 'magic' sequence 'B' 'Z' 'h'";
}
else if(boost::iostreams::bzip2::config_error) {
// libbzip2 has been improperly configured for the current platform
cout << "libbzip2 has been improperly configured for the current platform";
}
}
}

Это говорит, что я получаю boost::iostreams::bzip2::config_error,

Значит ли это, что я неправильно установил фильтр bzip2 ???

Потому что я получаю ошибку, которую я использовал

b2 --toolset=msvc-10.0 -sBZIP2_SOURCE="C:\bzip2-1.0.6" --build-type=complete stage

Я получил:

C:\boost_1_54_0>b2 --toolset=msvc-10.0 -sBZIP2_SOURCE="C:\bzip2-1.0.6" --build-t
ype=complete stage
Performing configuration checks

- 32-bit                   : yes (cached)
- arm                      : no  (cached)
- mips1                    : no  (cached)
- power                    : no  (cached)
- sparc                    : no  (cached)
- x86                      : yes (cached)
error: No best alternative for libs/coroutine/build/allocator_sources
next alternative: required properties: <link>static <target-os>windows <thre
ading>multi
not matched
next alternative: required properties: <link>static <segmented-stacks>on <th
reading>multi
not matched
next alternative: required properties: <link>static <threading>multi
not matched
- has_icu builds           : no  (cached)
warning: Graph library does not contain MPI-based parallel components.
note: to enable them, add "using mpi ;" to your user-config.jam
- zlib                     : no  (cached)
- iconv (libc)             : no  (cached)
- iconv (separate)         : no  (cached)
- icu                      : no  (cached)
- icu (lib64)              : no  (cached)
- message-compiler         : yes (cached)
- compiler-supports-ssse3  : yes (cached)
- compiler-supports-avx2   : no  (cached)
- gcc visibility           : no  (cached)
- long double support      : yes (cached)
warning: skipping optional Message Passing Interface (MPI) library.
note: to enable MPI support, add "using mpi ;" to user-config.jam.
note: to suppress this message, pass "--without-mpi" to bjam.
note: otherwise, you can safely ignore this message.
warning: No python installation configured and autoconfiguration
note: failed.  See http://www.boost.org/libs/python/doc/building.html
note: for configuration instructions or pass --without-python to
note: suppress this message and silently skip all Boost.Python targets
error: No best alternative for libs/coroutine/build/allocator_sources
next alternative: required properties: <link>static <target-os>windows <thre
ading>multi
not matched
next alternative: required properties: <link>static <segmented-stacks>on <th
reading>multi
not matched
next alternative: required properties: <link>static <threading>multi
not matched
- zlib                     : no  (cached)
error: No best alternative for libs/coroutine/build/allocator_sources
next alternative: required properties: <link>static <target-os>windows <thre
ading>multi
not matched
next alternative: required properties: <link>static <segmented-stacks>on <th
reading>multi
not matched
next alternative: required properties: <link>static <threading>multi
not matched
- zlib                     : no  (cached)
error: No best alternative for libs/coroutine/build/allocator_sources
next alternative: required properties: <link>static <target-os>windows <thre
ading>multi
not matched
next alternative: required properties: <link>static <segmented-stacks>on <th
reading>multi
not matched
next alternative: required properties: <link>static <threading>multi
not matched
- zlib                     : no  (cached)
- zlib                     : no  (cached)
- zlib                     : no  (cached)
error: No best alternative for libs/coroutine/build/allocator_sources
next alternative: required properties: <link>static <target-os>windows <thre
ading>multi
not matched
next alternative: required properties: <link>static <segmented-stacks>on <th
reading>multi
not matched
next alternative: required properties: <link>static <threading>multi
not matched
- zlib                     : no  (cached)
error: No best alternative for libs/coroutine/build/allocator_sources
next alternative: required properties: <link>static <target-os>windows <thre
ading>multi
not matched
next alternative: required properties: <link>static <segmented-stacks>on <th
reading>multi
not matched
next alternative: required properties: <link>static <threading>multi
not matched
- zlib                     : no  (cached)
- zlib                     : no  (cached)
- zlib                     : no  (cached)
error: No best alternative for libs/coroutine/build/allocator_sources
next alternative: required properties: <link>static <target-os>windows <thre
ading>multi
not matched
next alternative: required properties: <link>static <segmented-stacks>on <th
reading>multi
not matched
next alternative: required properties: <link>static <threading>multi
not matched
- zlib                     : no  (cached)
error: No best alternative for libs/coroutine/build/allocator_sources
next alternative: required properties: <link>static <target-os>windows <thre
ading>multi
not matched
next alternative: required properties: <link>static <segmented-stacks>on <th
reading>multi
not matched
next alternative: required properties: <link>static <threading>multi
not matched
- zlib                     : no  (cached)

Component configuration:

- atomic                   : building
- chrono                   : building
- context                  : building
- coroutine                : building
- date_time                : building
- exception                : building
- filesystem               : building
- graph                    : building
- graph_parallel           : building
- iostreams                : building
- locale                   : building
- log                      : building
- math                     : building
- mpi                      : building
- program_options          : building
- python                   : building
- random                   : building
- regex                    : building
- serialization            : building
- signals                  : building
- system                   : building
- test                     : building
- thread                   : building
- timer                    : building
- wave                     : building

...patience...
...patience...
...patience...
...patience...
...patience...
...found 47439 targets...

C:\boost_1_54_0>b2 --toolset=msvc-10.0 -sBZIP2_SOURCE="C:\bzip2-1.0.6" --build-type=complete stage
Performing configuration checks

- 32-bit                   : yes (cached)
- arm                      : no  (cached)
- mips1                    : no  (cached)
- power                    : no  (cached)
- sparc                    : no  (cached)
- x86                      : yes (cached)
error: No best alternative for libs/coroutine/build/allocator_sources
next alternative: required properties: <link>static <target-os>windows <threading>multi
not matched
next alternative: required properties: <link>static <segmented-stacks>on <threading>multi
not matched
next alternative: required properties: <link>static <threading>multi
not matched
- has_icu builds           : no  (cached)
warning: Graph library does not contain MPI-based parallel components.
note: to enable them, add "using mpi ;" to your user-config.jam
- zlib                     : no  (cached)
- iconv (libc)             : no  (cached)
- iconv (separate)         : no  (cached)
- icu                      : no  (cached)
- icu (lib64)              : no  (cached)
- message-compiler         : yes (cached)
- compiler-supports-ssse3  : yes (cached)
- compiler-supports-avx2   : no  (cached)
- gcc visibility           : no  (cached)
- long double support      : yes (cached)
warning: skipping optional Message Passing Interface (MPI) library.
note: to enable MPI support, add "using mpi ;" to user-config.jam.
note: to suppress this message, pass "--without-mpi" to bjam.
note: otherwise, you can safely ignore this message.
warning: No python installation configured and autoconfiguration
note: failed.  See http://www.boost.org/libs/python/doc/building.html
note: for configuration instructions or pass --without-python to
note: suppress this message and silently skip all Boost.Python targets
error: No best alternative for libs/coroutine/build/allocator_sources
next alternative: required properties: <link>static <target-os>windows <threading>multi
not matched
next alternative: required properties: <link>static <segmented-stacks>on <threading>multi
not matched
next alternative: required properties: <link>static <threading>multi
not matched
- zlib                     : no  (cached)
error: No best alternative for libs/coroutine/build/allocator_sources
next alternative: required properties: <link>static <target-os>windows <threading>multi
not matched
next alternative: required properties: <link>static <segmented-stacks>on <threading>multi
not matched
next alternative: required properties: <link>static <threading>multi
not matched
- zlib                     : no  (cached)
error: No best alternative for libs/coroutine/build/allocator_sources
next alternative: required properties: <link>static <target-os>windows <threading>multi
not matched
next alternative: required properties: <link>static <segmented-stacks>on <threading>multi
not matched
next alternative: required properties: <link>static <threading>multi
not matched
- zlib                     : no  (cached)
- zlib                     : no  (cached)
- zlib                     : no  (cached)
error: No best alternative for libs/coroutine/build/allocator_sources
next alternative: required properties: <link>static <target-os>windows <threading>multi
not matched
next alternative: required properties: <link>static <segmented-stacks>on <threading>multi
not matched
next alternative: required properties: <link>static <threading>multi
not matched
- zlib                     : no  (cached)
error: No best alternative for libs/coroutine/build/allocator_sources
next alternative: required properties: <link>static <target-os>windows <threading>multi
not matched
next alternative: required properties: <link>static <segmented-stacks>on <threading>multi
not matched
next alternative: required properties: <link>static <threading>multi
not matched
- zlib                     : no  (cached)
- zlib                     : no  (cached)
- zlib                     : no  (cached)
error: No best alternative for libs/coroutine/build/allocator_sources
next alternative: required properties: <link>static <target-os>windows <threading>multi
not matched
next alternative: required properties: <link>static <segmented-stacks>on <threading>multi
not matched
next alternative: required properties: <link>static <threading>multi
not matched
- zlib                     : no  (cached)
error: No best alternative for libs/coroutine/build/allocator_sources
next alternative: required properties: <link>static <target-os>windows <threading>multi
not matched
next alternative: required properties: <link>static <segmented-stacks>on <threading>multi
not matched
next alternative: required properties: <link>static <threading>multi
not matched
- zlib                     : no  (cached)

Component configuration:

- atomic                   : building
- chrono                   : building
- context                  : building
- coroutine                : building
- date_time                : building
- exception                : building
- filesystem               : building
- graph                    : building
- graph_parallel           : building
- iostreams                : building
- locale                   : building
- log                      : building
- math                     : building
- mpi                      : building
- program_options          : building
- python                   : building
- random                   : building
- regex                    : building
- serialization            : building
- signals                  : building
- system                   : building
- test                     : building
- thread                   : building
- timer                    : building
- wave                     : building

...patience...
...patience...
...patience...
...patience...
...patience...
...found 47439 targets...

2

Решение

Ошибка, которую вы получаете, на самом деле вводит в заблуждение.

Это потому что:

if(boost::iostreams::bzip2::config_error)

…всегда оценивается как ненулевое и выдает неправильное сообщение об ошибке!

У меня нет ПК с Windows, но я проверил «твой» код на Mac (Boost установлен с помощью Homebrew) и получил ту же ошибку.

libbzip2 has been improperly configured for the current platform

И поэтому я исправил это и добавил некоторые проверки ошибок:

#include <fstream>
#include <iostream>
#include <boost/iostreams/filtering_streambuf.hpp>
#include <boost/iostreams/copy.hpp>
#include <boost/iostreams/filter/bzip2.hpp>
#include <boost/filesystem.hpp>

int main()
{
using namespace std;
using namespace boost::iostreams;

char filename[] = "gcc-4.7.2.tar.bz2";

if (!boost::filesystem::exists(filename))
{
cout << "Can't find " << filename << ". Expect errors to follow! " << endl;
}

ifstream file(filename, ios_base::in | ios_base::binary);

filtering_streambuf<input> in;
in.push(bzip2_decompressor());
in.push(file);
try
{
boost::iostreams::copy(in, cout);
}
catch (const bzip2_error& exception)
{
cout << exception.what() << endl;

int error = exception.error();
if (error == bzip2::data_error)
{
cout << "compressed data stream is corrupted";
}
else if (error == bzip2::data_error_magic)
{
cout << "compressed data stream does not begin with the 'magic' sequence 'B' 'Z' 'h'";
}
else if (error == bzip2::config_error)
{
cout << "libbzip2 has been improperly configured for the current platform";
}
else
{
cout << "Error: " << error;
}
cout << endl;
}
}

строить

> clang++ 18121908.cpp -lboost_iostreams -lboost_system -lboost_filesystem -o 18121908

Бежать

> ./18121908
Can't find gcc-4.7.2.tar.bz2. Expect errors to follow!
bzip2 error
Error: -7

Зачем -7? Так как #define BZ_UNEXPECTED_EOF (-7), Boost называет это bzip2::unexpected_eof, Вы неожиданно достигли конца поток!

Создайте правильный (если сомнительный) файл bzip2:

> echo 'There should be some compiler stuff in here' > gcc-4.7.2.tar
> bzip2 gcc-4.7.2.tar

Re беги

> ./18121908
There should be some compiler stuff in here

Заключение

Вам нужно проверить, существует ли файл, прежде чем пытаться распаковать его.

2

Другие решения

Других решений пока нет …

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector