2016-10-14 3 views
0

"writeFileBytes"以下の関数を使用してstd::vector<unsigned char>の内容をファイルに書き出します。私は "unsigned char"という型を使ってファイルを保存したいのです( "char"のキャストになります)。その理由は、 "unsigned char"は任意のバイト(例えば "00000000"ビット)との互換性があるからです。私たちが "char"を使用するとき、特定の "無効な"文字の操作にいくつかの問題があります。C++ - "std :: vector <unsigned char>"の内容をファイルに保存する

「00000000」ビット(1バイト)の問題の詳細については、What is the most suitable type of vector to keep the bytes of a file?を参照してください。

void writeFileBytes(const char* filename, std::vector<unsigned char>& fileBytes){ 
    std::ofstream file(filename, std::ios::out|std::ios::binary); 
    file.write(fileBytes.size() ? (char*)&fileBytes[0] : 0, 
       std::streamsize(fileBytes.size())); 
} 

writeFileBytes("xz.bin", fileBytesOutput); 

ネイティブファイルに書き込むタイプ「unsigned char型」を使用する方法はありますか?

この懸念は本当に意味がありますか?


UPDATE I:

ネイティブファイルに書き込むタイプ "unsigned char型" を使用する方法はありますか? - >はい!

krzaqのガイドラインに従ってください!

void writeFileBytes(const char* filename, std::vector<unsigned char>& fileBytes){ 
    std::ofstream file(filename, std::ios::out|std::ios::binary); 
    std::copy(fileBytes.cbegin(), fileBytes.cend(), 
     std::ostream_iterator<unsigned char>(file)); 
} 

UPDATE II:

この懸念は本当に理にかなって? - >いくつかの点で、はい!

私は以下のコメントとして...

」... 『unsigned char型は、』我々はこれらの8ビットを変換しようとする。( 『00000000』のビットを含む) 『互換性のより高いレベル』を持っているようです'00000000'ビットを 'char'に変更すると 'unsigned char'と違う値はありません。 'unsigned char'では無効な/ char型の 'char'値がありますが... "

詳細についてはWhat is the most suitable type of vector to keep the bytes of a file?をご覧ください。

+0

それは、説明や理由が付いているネガが来ると、それはコミュニティのためにとても良いし、(私のような)それを豊かにする。こうして私たちは一緒に物事を改善することができます!何か問題がある場合は、このスレッドを修正または削除できます。私たちは合理的な人だと確信しています。 –

+0

"00000000"ビット(1バイト)は、 "char"タイプでは認識できません。これらの8ビットを "char"に変換しようとすると、 "unsigned char"と違って値はありません。 "unsigned char"では、無効な/認識されない "char"値がありますが、それがあります。私はこの議論をhttp://stackoverflow.com/questions/40052857/c-save-the-contents-of-a-stdvectorunsigned-char-to-a-file/40052889#40052889で見てみることをお勧めします。ありがとう! –

答えて

1

char*はどんな種類のデータにもアクセスでき、正常に動作します。あなたが明示的なキャストを使用しない場合でも、多分std::copystd::ostreambuf_iteratorを使用します。

copy(fileBytes.cbegin(), fileBytes.cend(), 
    ostreambuf_iterator<char>(file)); 

代わりに、あなたは

copy(fileBytes.cbegin(), fileBytes.cend(), 
    ostream_iterator<char>(file)); 

を呼び出すことができますしかし、それは唯一の可能性が遅くなり、同じことを行います。

Btw:nullポインタをwrite、つまりUBに渡すことはできません。

+0

私はあなたに同意します。しかし、私たちはこのスレッドで見ることができるようにhttp://stackoverflow.com/questions/40052857/c-save-the-contents-of-a-stdvectorunsigned-char-to-a-file/40052889#40052889 "unsigned char" 「より高いレベルの互換性」(「00000000」ビットを含む)を有するように思われる。これらの8ビット( "00000000"ビット)を "char"に変換しようとすると、 "unsigned char"と違って値はありません。 "unsigned char"では、無効な/認識されない "char"値がありますが、それがあります。ありがとう! –

+0

次のエラーが表示されます。 "エラー: 'std :: ostreambuf_iterator :: ostreambuf_iterator(std :: ofstream&)'の呼び出しで一致する関数がありません。アイデア?これらは、コードが含まれているます。#include 、の#include 、の#include 、の#include 、の#include 、の#include 、の#include 、の#include 、の#include 、の#include 、の#include 、 #include

+0

@EduardoLucio代わりに 'ostreambuf_iterator (ファイル)'を試してください。 – krzaq

関連する問題