簡體   English   中英

C ++ fwrite和fread字符串

[英]C++ fwrite and fread for string

這是在二進制文件中寫入字符串的代碼:

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;

問題:

  • 有沒有更簡單的方法可以做到這一點?
  • 當我寫/讀文件時,我應該考慮來自c_str()的空字符'\\0'嗎?

我有一個與char* c(new char[N])

  • 我知道c ++不允許使用int a[size_of_array]創建靜態數組,因此解決方案是使用由new[]創建a[size_of_array] delete[]刪除的指針。 這是唯一的解決方案(如果我不能使用std::vector < int > ),這種解決方案會有效嗎?

首先, 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());

像這樣:

#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;
}

按照您選擇的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 ++字符串實際上可以包含空字節。 序列化代碼不是施加限制的地方。

#include <fstream.h>
...
char buffer[100];
ofstream bfile("data.bin", ios::out | ios::binary);
bfile.write (buffer, 100);

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM