繁体   English   中英

文件的ifstream.read()

[英]ifstream.read() of a file

所以我做了一个输出文件来做到这一点:

   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();
    }

我尝试运行C ++ exe时,它就会中断。 我试图返回字符串。 如果有人可以将我指向教程/帖子/问题/或向我解释ifstream读取的工作原理,请提前感谢您XD

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

  1. 要写入的std::string的长度。
  2. std::string

操作看起来像这样:

write(stream, s.size());
write(stream, s.c_str(), s.size());

(函数write()适当地实现了整数值和字符序列的序列化;在我看来,仅写字节不是可行的方法)

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

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

std::string s;
s.resize(read<std::string::size_type>(stream));
read(stream, s.data(), s.size());

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM