2

バイナリファイルに文字列を書き込むコードは次のとおりです。

std::string s("Hello");
unsigned int N(s.size());
fwrite(&N,sizeof(N), 1 ,bfile);
fwrite(s.c_str(),1, N ,bfile);
fflush(bfile);

文字列を読み取る部分:

std::string new_s("");
unsigned int N(0);
fread(&N,sizeof(N),1,bfile);
char* c(new char[N+1]);
fread(c,1,N,bfile);
c[N] = '\0';
new_s = c;
delete[] c;

質問:

  • それを行うためのより簡単な方法はありますか?
  • ファイルを読み書きするとき、?'\0'から来るヌル文字を考慮に入れる必要がありますc_str()か?

私はに関連する副次的な質問がありますchar* c(new char[N])

  • 私はc++が例えばintで静的配列を作成することを許可しないことを知っているので、解決策はで作成され削除されa[size_of_array]たポインタを使用することです。これが唯一の解決策であり(私が使用できない場合)、この解決策は効率的でしょうか?new[]delete[]std::vector < int >
4

4 に答える 4

1

まず、std::string::size()NUL 文字を考慮していないため、バイナリ ファイルにはそれが含まれません。シリアル化の戦略は問題ありません (最初にサイズ、次に一連の文字が続きます)。

読み取りに関しては、vector(c++03 で、またはstringc++11 で直接) a を使用することをお勧めします。

Nしたがって、サイズ ( )を決定したら、次のようにします。

std::vector<char> content(N, 0); // substitute std::string if possible
fread(&content[0],1,N,bfile);
// Construct the string (skip this, if you read into the string directly)
std::string s(content.begin(), content.end());
于 2013-03-12T16:18:47.543 に答える
0

cstdio の選択を維持すると、次のようになります。

fprintf(bfile,"%d ",N);
fwrite(s.data(),1,N,bfile);
if ( ferror(bfile) ) die("writing bfile");
char c;
if ( fscanf(bfile,"%d%c",&N,&c)  != 2 
  || c != ' ' ) die("bfile metadata");
vector<char> buf(N);
if ( fread(&buf[0],1,N,bfile) != N ) die("bfile data");
s.assign(&buf[0],N);

バイナリ シリアライゼーション形式は苦痛のレシピです。数日または数週間の時間に見合う利益が得られるという具体的な証拠がない場合は、それらを完全に避けてください.

C++ 文字列には、実際には null バイトを含めることができます。シリアル化コードは、制限を課す場所ではありません。

于 2013-03-12T18:12:08.470 に答える
0

このようなもの:

#include <iostream>
#include <fstream>

int main(int argc, char** argv) {

        std::string someString = argc > 1? argv[1]:"Hello World";
        std::ofstream out("fileName.txt",std::ios::binary | std::ios::out);
        size_t len = someString.size();
        out.write((const char*)&len, 4);
        out<<someString; // out.write(someString.c_str(), someString.size())
        out.flush();
        out.close();


        std::ifstream in("fileName.txt",std::ios::binary | std::ios::in);
        in.read((char*)&len, 4);
        char *buf = new char[len];
        in.read(buf, len);
        std::string someStringRead(buf, len);
        delete[] buf; // this might be better with scoped_array
        in.close();

        std::cout<<"Read ["<<someStringRead<<"]"<<std::endl;
        return 0;
}
于 2013-03-12T16:12:03.617 に答える
-1
#include <fstream.h>
...
char buffer[100];
ofstream bfile("data.bin", ios::out | ios::binary);
bfile.write (buffer, 100);
于 2013-03-12T16:10:51.277 に答える