// C++ Primer Plus 794页,习题7
/*
该程序将键盘输入读取到一个由string对象组成的vector中,
将字符串内容(而不是string对象)存储到一个文件中,
然后该文件的内容复制到另一个由string对象组成的vector中。
*/
#include <iostream>
#include <string>
#include <fstream>
#include <vector>
#include <iterator>
#include <algorithm>
// 输出string 的函数
void ShowStr(const std::string &s) {
std::cout << s << std::endl;
}
// 将字符串信息写入到文件中
class Store {
private:
std::ofstream &fout;
public:
Store(std::ofstream &os) :fout(os) {};
void operator()(const std::string &str) {
size_t len = str.size(); // size的返回类型,len存储字符串的长度
fout.write((char*)&len, sizeof(std::size_t)); // 先存储长度,
fout.write(str.data(), len); // 这里是指定字符数,把字符串不包括'\0'写入文件
}
};
// 根据文件恢复信息
void GetStrs(std::ifstream &fin, std::vector<std::string> &vec) {
size_t len; // 使用read来获取长度
while (fin.read((char *)&len, sizeof(size_t))) {
// 这里要知道循环条件就是字符数
char *str = new char[len];
fin.read(str, len);
str[len] = '\0'; //人为添加空字符
vec.push_back(str);
}
}
int main() {
using namespace std;
vector<string> vostr; //string 向量
string temp;
// 键盘输入string
cout << "请输入strings(空行退出):\n";
while (getline(cin, temp) && temp[0] != '\0')
vostr.push_back(temp);
cout << "您的输入如下::\n";
for_each(vostr.begin(), vostr.end(), ShowStr);
// 存储string的内容到文件
ofstream fout("strings.dat", ios::out);
for_each(vostr.begin(), vostr.end(), Store(fout));
fout.close();
// 复制文件内容到另一个由string对象组成的vector中
vector<string> vistr;
ifstream fin("strings.dat", ios::in);
if (!fin.is_open()) {
cerr << "无法打开输入文件。\n";
exit(EXIT_FAILURE);
}
GetStrs(fin,vistr);
fout.close();
cout << "\n从文件中读取的字符串如下:\n";
for_each(vistr.begin(), vistr.end(), ShowStr);
return 0;
}
string的内容存储到文件中
最后编辑于 :
©著作权归作者所有,转载或内容合作请联系作者
- 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
- 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
- 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...