【足迹C++primer】22、文件输入输出

文件输入输出

使用文件流对象

创建文件流对象时,我们可以提供文件名(可选)。如果提供了一个文件名,则open会自动被调用:

ifstream in(ifile);     //构造一个ifstream并打开给定文件
ofstream out;           //输出文件流未关联到任何文件

用fstream代替iostream&

首先这里有一个头文件和一个定义的文件要使用

Sales_data.h

#ifndef SALES_DATA_H_INCLUDED
#define SALES_DATA_H_INCLUDED

#include <string>
#include <iostream>

class Sales_data
{
    friend Sales_data add(const Sales_data&, const Sales_data&);
    friend std::ostream &print(std::ostream&, const Sales_data&);
    friend std::istream &read(std::istream&, Sales_data&);
public:
	// constructors
	Sales_data(): units_sold(0), revenue(0.0) { }
	Sales_data(const std::string &s):
	           bookNo(s), units_sold(0), revenue(0.0) { }
	Sales_data(const std::string &s, unsigned n, double p):
	           bookNo(s), units_sold(n), revenue(p*n) { }
	Sales_data(std::istream &);

	// operations on Sales_data objects
	std::string isbn() const { return bookNo; }
	Sales_data& combine(const Sales_data&);
	double avg_price() const;
private:
	std::string bookNo;
	unsigned units_sold;
	double revenue;
};

#endif // SALES_DATA_H_INCLUDED

还有一个头文件的定义文件也要引入!!

#include <iostream>
using std::istream; using std::ostream;

#include "Sales_data.h"
Sales_data::Sales_data(std::istream &is)
{
	// read will read a transaction from is into this object
	read(is, *this);
}

double
Sales_data::avg_price() const {
	if (units_sold)
		return revenue/units_sold;
	else
		return 0;
}

// add the value of the given Sales_data into this object
Sales_data&
Sales_data::combine(const Sales_data &rhs)
{
	units_sold += rhs.units_sold; // add the members of rhs into
	revenue += rhs.revenue;       // the members of ``this'' object
	return *this; // return the object on which the function was called
}

Sales_data
add(const Sales_data &lhs, const Sales_data &rhs)
{
	Sales_data sum = lhs;  // copy data members from lhs into sum
	sum.combine(rhs);      // add data members from rhs into sum
	return sum;
}

// transactions contain ISBN, number of copies sold, and sales price
istream&
read(istream &is, Sales_data &item)
{
	double price = 0;
	is >> item.bookNo >> item.units_sold >> price;
	item.revenue = price * item.units_sold;
	return is;
}

ostream&
print(ostream &os, const Sales_data &item)
{
	os << item.isbn() << " " << item.units_sold << " "
	   << item.revenue << " " << item.avg_price();
	return os;
}

最后使用fstream代替iostream,因为fstream是继承了iostream 的

/*
* 功能:用fstream代替iostream&
* 时间:2014年6月7日07:58:39
* 作者:cutter_point
*/

#include"Sales_data.h"
#include"Sales_data.cc"
#include<fstream>

using namespace std;

int main()
{
    string argv[3];
    ifstream input(argv[1]);    //打开销售记录文件
    ofstream output(argv[2]);   //打开输出文件
    Sales_data total;           //保存销售总额的变量

    if(read(input, total))      //读取一条记录
    {
       //保存下一条销售记录的变量
       Sales_data trans;
       while(read(input, trans))
       {
            //读取剩余的记录
            if(total.isbn() == trans.isbn())
                total.combine(trans);   //更新销售总额
            else
            {
                print(output, total)<<endl;     //打印结果
                total=trans;        //处理下一本书
            }
        }

        print(output, total)<<endl;     //打印最后一本书
    }
    else
        cerr<<"No data?!"<<endl;

    return 0;
}

吧一个文件里面的内容读取到DOS上面!

/*
* 功能:读取文件
* 时间:2014年6月7日08:51:44
* 作者:cutter_point
*/

#include<iostream>
#include<fstream>
#include<string>
#include<vector>

using namespace std;

int main()
{
    vector<string> v1;
    ifstream infile("C:\\booklist.txt");
    char s1[30];

    while(infile)
    {
        infile.getline(s1,30);
        v1.push_back(s1);
    }

    infile.close();

    for(int i=0 ; i<v1.size() ; ++i)
    {
        cout<<v1[i]<<endl;
    }

    return 0;
}

文件模式

in 以读的方式打开

out 以写的方式打开

app 每次操作前均定位到文件末尾

ate 打开文件后立即定位到文件末尾

trunc 截断文件

binary 以二进制方式进行IO

/*
* 功能:文件模式
* 时间:2014年6月7日09:06:29
* 作者:cutter_point
*/

#include<iostream>
#include<string>
#include<fstream>
#include<vector>

using namespace std;

int main()
{
    ofstream outfile;
    outfile.open("booklist.txt", ofstream::app);
    int i=0;

    while(i != 2)
    {
        outfile<<"This is just a kinding!!"<<endl;
        ++i;
    }

    outfile.close();

    return 0;
}

PS:一直对IO流特别是文件流这一块不怎么熟悉,这次我是回了好多了!!!开心,我一定可以玩转IO的,哈哈!!

【足迹C++primer】22、文件输入输出

时间: 2024-10-10 14:54:23

【足迹C++primer】22、文件输入输出的相关文章

【足迹C++primer】30、概述(泛型算法)

概述(泛型算法) 大多数算法都定义在头文件algorithm中.标准库还在头文件numeric中定义了一组泛型算法. #include<iostream> #include<numeric> #include<vector> #include<algorithm> using namespace std; int main() { vector<int> vec; for(size_t t=0 ; t != 44 ; ++t) { vec.pus

【足迹C++primer】38、关联容器操作(2)

关联容器操作(2) map的下标操作 map的下标操作 map和unordered_map容器提供了下标运算符合一个对应的at函数 对于一个map使用下标操作,其行为与数组或vector上的下标操作很不相同: 使用一个不再容器中的关键字作为下标,会添加一个此关键字的元素到map中 map和unordered_map的下标操作 c[k] 返回关键字为k的元素,如果关键字k不再c中,添加一个关键字为k的元素,对其进行值初始化 c.at(k) 访问关键字为k的元素,带参数检测,如果k不再c重那么返回一

【足迹C++primer】41、文本查询程序

/** * 功能:使用标准库:文本查询程序 * 时间:2014年7月10日09:10:15 * 作者:cutter_point */ #include<iostream> #include<map> #include<set> #include<fstream> #include<sstream> #include<string> #include<vector> #include<memory> using

【足迹C++primer】31、初识泛型算法

初识泛型算法 理解算法的最基本方法是了解他们是否读取元素.改变元素或是重排元素顺序! 只读算法 #include<iostream> #include<numeric> using namespace std; //对vec中的元素求和,初值是0 int sum=accumulate(vec.cbegin(), vec.cend(), 0); 这里面第三个参数决定了函数使用哪个加法运算符以及返回值类型. 算法和元素类型 string sum=accumulate(v.cbegin(

【足迹C++primer】54、继承类的范围,构造函数和拷贝控制

继承类的范围,构造函数和拷贝控制 当用派生类执行函数的时候,首先会在当前的类里面找 如果找不到就一级一级地往上找. Name Lookup Happens at Compile Time class Quote { public: Quote()=default; Quote(const string &book, double sales_price):bookNo(book), price(sales_price) {cout<<"Quote gouzhao functi

【足迹C++primer】33、再探迭代器

再探迭代器 这里有插入迭代器,有流迭代器,反向迭代器,移动迭代器. 插入迭代器 这是一种迭代器适配器,接受一个容器,生成一个迭代器,实现向给定容器添加元素. 插入迭代器有三种类型,差异在于元素插入的位置 back_inserter创建一个使用push_back的迭代器. front_inserter创建一个使用push_front的迭代器. inserter创建一个使用insert的迭代器. void fun1() { list<int> lst={1,2,3,4}; list<int&

【足迹C++primer】37、关联容器概述

关联容器概述 关联容器不支持顺序容器的位置操作,如push_back或push_front 也不支持构造函数或插入操作这些接受一个元素值和一个数量值的操作. 定义关联容器 这里注意哦,我这是一个函数,里面关联容器map是包含在头文件map中的!!! 还有就是set是包含在头文件set中的,string是包含在头文件string中的!!! //关联容器初始化 void fun1() { map<string, size_t> word_count; //空容器 //列表初始化 set<st

【足迹C++primer】39、动态内存与智能指针(2)

动态内存与智能指针(2) 直接管理内存 void fun1() { //此new表达式在自由空间构造一个int型对象,并返回指向该对象的指针 int *pi1=new int; //pi指向一个动态分配.未初始化的无名对象 string *ps3=new string; //初始化为空string int *pi2=new int; //pi指向一个未初始化的int int *pi3=new int(1024); //pi指向的对象的值为1024 string *ps4=new string(1

【足迹C++primer】56、文本查询程序

/** * 功能:文本查询程序 * 时间:2014年7月23日10:26:09 * 作者:cutter_point */ #include<iostream> #include<algorithm> #include<memory> #include<set> #include<map> #include<fstream> #include<sstream> using namespace std; /* Alice Em