首页 > 代码库 > 【足迹C++primer】22、文件输入输出
【足迹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
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的,哈哈!!
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。