C++ Premier Plus 6th edition - Programming excercise - Chapter17 - 7

#include<iostream>
#include<fstream>// fout
#include<vector>
#include<string>
#include<algorithm>// for_each()
using namespace std;

// write to file. use ifstream to input to stream,in which use ofstream to output from
class Store
{
private:
    ofstream& fout;// member
public:
    Store(ofstream& f) :fout(f) {}; // constructor
    void operator()(string & str);
    ~Store() {};
};
// member functions of class Store
void Store::operator()(string & str)
{
    size_t len = str.length();// count of characters in string
    fout.write((char*)& len, sizeof(size_t));// write len to file

    // wanna extract characters from string,but string obj don't store characters by itselt
    // but store a pointer points to heap block, so need to store characters to an array,then
    // use write() to get data from the address of this array which stores characters
    fout.write(str.data(), len);// take len characters from array pointed by str.data(),or use (char*)str.c_str()
    fout << '\n';// seperate each log,more obvious for human
}

// show string obj
void ShowStr(string& str)
{
    cout << str << '\n';
}

void GetStrs(istream& fin, vector<string>& vs)
{
    //fin.read(),don't use this way, can't directly cover,
    // string itself don't contains characters, but a pointer points heap block
    while (!fin.eof())
    {
        // acquir string length
		string strtmp;
        size_t len = 0;
        fin.read((char*)& len, sizeof(size_t));// read sizeof(int) binary data to address of len
        // acquir characters
        char ch;
        for (size_t i = 0; i < len; i++)
        {
            fin.read((char*)&ch, sizeof(char));// or fin.get(ch);
            strtmp.push_back(ch);
        }
        vs.push_back(strtmp);
        fin.get();// dicard '\n' written by read()
    }
}

int main()
{
    vector<string> vostr;
    string temp;
    // acquire strings
    cout << "Enter strings (empty line to quit):\n";
    while (getline(cin, temp) && temp[0] != '\0')// input newline to stop looping
        vostr.push_back(temp);
    cout << "Here is your input.\n";
    for_each(vostr.begin(), vostr.end(), ShowStr);
    // store in a file
    ofstream fout("strings.dat", ios_base::out | ios_base::binary);
    for_each(vostr.begin(), vostr.end(), Store(fout));
    fout.close();
    // recover file contents
    vector<string> vistr;
    ifstream fin("strings.dat", ios_base::in | ios_base::binary);
    if (!fin.is_open())
    {
        cerr << "Could not open file for input.\n";
        exit(EXIT_FAILURE);
    }
    GetStrs(fin, vistr);
    cout << "\nHere are the strings read from the file:\n";
    for_each(vistr.begin(), vistr.end(), ShowStr);

    cin.get();
    return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 格外实用的c语言编程书籍——premier电子版。它是由Prata编写的,是一本<classic>级别的大部头教材,对c语言的各个方面进行了细致地讲解。该书在全球范围内广受好评,被誉为c语言编程经典入门读物。相较于传统的纸质版,电子版更具备便携性和交互性两大特点。在电子版上,你可以轻松地进行文字搜索、章节跳转、笔记记录等操作,在阅读体验上更为人性化,使你更好地掌握知识。 此书内容详尽、深入浅出,对想从事c语言编程的软件工程师具有广泛的适用性,从初学者到进阶者都能够从中获益良多。全书共计1100多页,涵盖了c语言的基础知识和高级应用,包括数据类型、流控制语句、结构体、函数、指针、内存管理等等。同时,该书中还有大量的示例代码和练习题,非常适合用来辅助学习和巩固所学知识。 总之,c语言是计算机编程语言中必不可少的一门,而premier电子版则是学习c语言的必备工具书。不管是从事软件开发的新手,还是追求技术深度的老手,都能够从这本书中汲取到宝贵的知识,帮助他们更好地编写优秀的程序。 ### 回答2: c premier是一种用于C语言编程的电子版本集成开发环境(IDE),它可以提供一个完整的开发环境,包括编辑器、编译器和调试器。使用c premier电子版可以方便地编写和管理C语言程序,加速开发流程,减少开发错误。c premier具有先进的功能,如语法突出显示、自动完成和脚本编写等,可用于各种类型的C语言程序开发包括嵌入式系统、桌面应用程序等。此外,c premier还具有强大的调试器,可以帮助开发人员查找和修复程序中的错误。c premier电子版的优势之一是它可以在不同平台上运行,包括Windows、Mac和Linux系统。总之,c premier电子版是一种非常实用的C语言开发环境,可以轻松编写高质量的C语言程序。 ### 回答3: Premier电子版是一种数字化的电子期刊,主要用于在线发布、订阅和阅读相关的经济、商业、金融和管理等领域的文章和研究。该电子版的优势在于其能够提供便利快捷的服务,用户无需购买实体版本,通过在线订阅即可随时随地浏览该刊物,方便用户学习和参考。此外,Premier电子版可以保证内容质量和权威性,其收录的文章和报告均来自于经过严格审稿的学术或专业期刊,保证了内容的可信度和专业性。另外,Premier电子版拥有较完善的检索和分类系统,用户可以按照自己的需求和兴趣对文章进行检索和筛选,从而节省时间和精力。总的来说,Premier电子版为学术研究者、商业从业者和爱好者提供了一个高质量、可信、便捷和多样的学习和借鉴资源,有助于推动相关领域的发展。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值