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

我定义了一个对象,对象里有两个数据成员都是string类型,现在如何将这两个string类型存入到一个文件中(最好用二进制文件存储),然后把它们从文件中读取出来,再赋值给这个对象的两个string类型数据成员。

这里假设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;
}

温馨提示:答案为网友推荐,仅供参考
第1个回答  2012-09-07
对于不定长数据,一般使用的简便方法是,先保存数据长度,然后保存这个长度的内容。
象你的数据有两个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类型长度是多少,那该怎么做?

追答

没办法,你总得想个办法表面那是头,那是尾吧。不然计算机会帮你办吗,计算机可是相当的笨,你叫他干啥他就干啥,多一点都不做。如果你不教他,哪儿是字符串的结尾,他就把整个文件都给你。

本回答被提问者和网友采纳