这是将字符串写入二进制文件的代码片段:
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])
:
a[size_of_array]
创建静态数组,因此解决方案是使用由new[]
创建并使用delete[]
删除的指针。这是唯一的解决方案(如果我不能使用std::vector < int >
),这个解决方案是否有效?答案 0 :(得分: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;
}
答案 1 :(得分:0)
首先,std::string::size()
不考虑NUL字符,因此您的二进制文件不会包含该字符。您的序列化策略很好(首先是大小,然后是一组字符。)
至于阅读,最好使用vector
(在c ++ 03中,或直接在c ++ 11中使用string
。)
因此,一旦确定了尺寸(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());
答案 2 :(得分: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 ++字符串实际上可以包含空字节。序列化代码不是施加限制的地方。
答案 3 :(得分:-1)
#include <fstream.h>
...
char buffer[100];
ofstream bfile("data.bin", ios::out | ios::binary);
bfile.write (buffer, 100);