C++中如何将两个连续的string 类型存入到文件中并读取出来?

我定义了一个对象,对象里有两个数据成员都是string类型,现在如何将这两个string类型存入到一个文件中(最好用二进制文件存储),然后把它们从文件中读取出来,再赋值给... 我定义了一个对象,对象里有两个数据成员都是string类型,现在如何将这两个string类型存入到一个文件中(最好用二进制文件存储),然后把它们从文件中读取出来,再赋值给这个对象的两个string类型数据成员。 展开
 我来答
cqdjyy01234
2015-10-20 · TA获得超过1147个赞
知道小有建树答主
回答量:267
采纳率:50%
帮助的人:304万
展开全部

这里假设string类型可能包含任意字符。否则,只需用不可能出现的字符分隔开即可。

因此,唯一的办法是将string的长度也写入到文件当中。下面是示例:

#include <string>
#include <fstream>
#include <sstream>
#include <vector>
#include <iostream>

inline void WriteString(std::ostream& ostr, std::string const& str) {
    // 写入字符串长度
    ostr << str.size() << "\n";
    // 写入字符串
    ostr.write(str.data(), str.size());
}

inline std::string ReadString(std::istream& istr) {
    // 获取字符串长度
    std::string line;
    std::getline(istr, line);
    std::istringstream tmp(line);
    std::size_t size;
    tmp >> size;
    // 读取字符串
    std::vector<char> result(size);
    istr.read(result.data(), size);
    return std::string(result.begin(), result.end());
}

int main() {
    std::string const filename = "t.txt", s1 = "string 1 \n Yeah!", s2 = "string 2 \\ Yep!";
    {
        std::ofstream ostr(filename);

        WriteString(ostr, s1);
        WriteString(ostr, s2);
    }
    {
        std::ifstream istr(filename);
        std::cout << (ReadString(istr) == s1 && ReadString(istr) == s2) << "\n";
    }

    return 0;
}
byzxybd
2012-09-07 · TA获得超过455个赞
知道小有建树答主
回答量:731
采纳率:100%
帮助的人:424万
展开全部
对于不定长数据,一般使用的简便方法是,先保存数据长度,然后保存这个长度的内容。
象你的数据有两个string。
class A
{
std::string s1, s2;
}

FILE *fp = fopen("a.man", "w");
...
int n = s1.size();
fwrite(&n, sizeof(n),1, fp);
fwrite(s1.c_str(), 1, n, fp);
...
int n = s2.size();
fwrite(&n, sizeof(n),1, fp);
fwrite(s2.c_str(), 1, n, fp);

// read

fread(&n, sizeof(n), 1, fp);
char *p = new char[n];
fread(p, 1, n, fp);
s1 = p;
delete[] p;

fread(&n, sizeof(n), 1, fp);
char *p = new char[n];
fread(p, 1, n, fp);
s2 = p;
delete[] p;
追问
假如说我不知道文件里存的string类型长度是多少,那该怎么做?
追答
没办法,你总得想个办法表面那是头,那是尾吧。不然计算机会帮你办吗,计算机可是相当的笨,你叫他干啥他就干啥,多一点都不做。如果你不教他,哪儿是字符串的结尾,他就把整个文件都给你。
本回答被提问者和网友采纳
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式