string的内容存储到文件中

2017-12-27  本文已影响0人  微雨旧时歌丶

// 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;
}
上一篇 下一篇

猜你喜欢

热点阅读