C++中如何将两个连续的string 类型存入到文件中并读取出来?
我定义了一个对象,对象里有两个数据成员都是string类型,现在如何将这两个string类型存入到一个文件中(最好用二进制文件存储),然后把它们从文件中读取出来,再赋值给...
我定义了一个对象,对象里有两个数据成员都是string类型,现在如何将这两个string类型存入到一个文件中(最好用二进制文件存储),然后把它们从文件中读取出来,再赋值给这个对象的两个string类型数据成员。
展开
2个回答
展开全部
这里假设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;
}
展开全部
对于不定长数据,一般使用的简便方法是,先保存数据长度,然后保存这个长度的内容。
象你的数据有两个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。
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类型长度是多少,那该怎么做?
追答
没办法,你总得想个办法表面那是头,那是尾吧。不然计算机会帮你办吗,计算机可是相当的笨,你叫他干啥他就干啥,多一点都不做。如果你不教他,哪儿是字符串的结尾,他就把整个文件都给你。
本回答被提问者和网友采纳
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询