C++ 文件的ifstream.read()

C++ 文件的ifstream.read(),c++,ifstream,ofstream,C++,Ifstream,Ofstream,因此,我制作了一个输出文件,可以执行以下操作: ofstream outf; outf.open(filename); string str = "This is test!"; int lengthofstr = str.length(); outf.write((char*)&str, sizeof(lengthofstr)); outf.close(); 完成后,使用另一个程序(exe)读取文件: void readem(char* f

因此,我制作了一个输出文件,可以执行以下操作:

   ofstream outf;
   outf.open(filename);
   string str = "This is test!";
   int lengthofstr = str.length();
   outf.write((char*)&str, sizeof(lengthofstr));
   outf.close();
完成后,使用另一个程序(exe)读取文件:

    void readem(char* filename, ifstream &inf){

    inf.open(filename);

        string a;

        if (inf.is_open()){
            inf.read((char*)&a, sizeof(int));
            cout << a << endl;

        }
        else
            cout << "file is not opening!" << endl;

        inf.close();
    }
void readem(char*filename,ifstream&inf){
inf.open(文件名);
字符串a;
如果(inf.is_open()){
inf.read((char*)&a,sizeof(int));

您根本不能这样编写
std::string
!文件内容可能包含您希望它包含的字符(因为
std::string
可能会使用小字符串优化),但对于较大的字符串则不会:您正在编写的
std::string
对象只是“控制记录”要编写
std::string
,您可能需要编写两条信息:

  • 要写入的
    std::string
    的长度
  • std::string
    的字符
  • 这些操作看起来像这样:

    write(stream, s.size());
    write(stream, s.c_str(), s.size());
    
    std::string s;
    s.resize(read<std::string::size_type>(stream));
    read(stream, s.data(), s.size());
    
    (函数
    write()
    适当地实现了整数值和字符序列的序列化;在我看来,仅仅写字节并不是一个好办法)

    仅仅编写组成
    std::string
    对象的字符没有任何用处

    当将字节读入由
    std::string
    对象占用的内存时,会出现未定义的行为:字符串的控制记录部分被某些内容覆盖,这些内容不太可能生成有效的对象。假设对象是按上述方式写入的,则可以读取它(假设使用合适的反序列化函数
    read()
    )使用如下代码:

    write(stream, s.size());
    write(stream, s.c_str(), s.size());
    
    std::string s;
    s.resize(read<std::string::size_type>(stream));
    read(stream, s.data(), s.size());
    
    std::字符串s;
    s、 调整大小(读取(流));
    读取(流,s.data(),s.size());
    
    你不能把
    字符串*
    转换成
    字符*
    ,你可以只做一个简单的
    inf>
    大小(lengthofstr)
    是包含字符串长度的变量的大小,而不是字符串的实际长度。非常感谢!这就是我想知道的,我不确定ifstream read和ofstream write