Lecture 10. CPP Stream Input and Output
- 格式:pdf
- 大小:2.29 MB
- 文档页数:68
C++文件操作详解〔ifstream、ofstream、fstream〕C++ 通过以下几个类支持文件的输入输出:•ofstream: 写操作〔输出〕的文件类(由ostream引申而来)•ifstream: 读操作〔输入〕的文件类(由istream引申而来)•fstream: 可同时读写操作的文件类(由iostream引申而来)翻开文件(Open a file)对这些类的一个对象所做的第一个操作通常就是将它和一个真正的文件联系起来,也就是说翻开一个文件。
被翻开的文件在程序中由一个流对象(stream object)来表示(这些类的一个实例) ,而对这个流对象所做的任何输入输出操作实际就是对该文件所做的操作。
要通过一个流对象翻开一个文件,我们使用它的成员函数open():void open (const char * filename, openmode mode);这里filename 是一个字符串,代表要翻开的文件名,mode 是以下标志符的一个组合:这些标识符可以被组合使用,中间以〞或〞操作符(|)间隔。
例如,如果我们想要以二进制方式翻开文件"example.bin" 来写入一些数据,我们可以通过以下方式调用成员函数open〔〕来实现:ofstream file;file.open ("example.bin", ios::out | ios::app | ios::binary);ofstream, ifstream 和fstream所有这些类的成员函数open 都包含了一个默认翻开文件的方式,这三个类的默认方式各不一样:只有当函数被调用时没有声明方式参数的情况下,默认值才会被采用。
如果函数被调用时声明了任何参数,默认值将被完全改写,而不会与调用参数组合。
由于对类ofstream, ifstream 和fstream 的对象所进展的第一个操作通常都是翻开文件,这些类都有一个构造函数可以直接调用open 函数,并拥有同样的参数。
c++调用out参数方法C++调用out参数方法是一种将函数返回值作为其他变量值的传递方式。
这种方法在需要对数据进行修改或处理时非常有用。
下面我们将详细介绍C++调用out参数方法的具体步骤和实例。
1.C++调用out参数方法简介在C++中,调用out参数方法主要是通过引用参数实现的。
out参数允许函数修改传递给它的变量,这种特性使得函数可以对输入参数进行处理并返回处理后的结果。
2.函数原型与声明要使用out参数,首先需要声明一个输出参数。
在函数声明中,使用引用关键字“&”表示输出参数。
以下是一个简单的函数原型示例:```cppvoid add(int a, int &b);```在这个例子中,函数add有两个输入参数a和b,其中b是输出参数。
函数将对a和b进行加法运算,并将结果存储在b中。
3.调用out参数的函数实例以下是一个使用out参数的函数实例:```cpp#include <iostream>void add(int a, int &b) {b = a + 5;}int main() {int x = 10;int y;add(x, y);std::cout << "After addition: " << y << std::endl;return 0;}```在这个例子中,函数add接受两个参数,其中一个是不变的输入参数x,另一个是输出参数y。
函数将对x和5进行加法运算,并将结果存储在y中。
在main函数中,我们调用add函数并将结果存储在变量y中。
最后,输出y 的值,可以看到它已经被修改为x+5。
4.注意事项在使用out参数时,请注意以下几点:- 输出参数必须是一个变量,不能是常量。
- 输出参数可以使用引用类型,这样可以避免值拷贝的开销。
- 输出参数在函数内部被修改后,函数外的原始变量将不受影响。
C++文件流在C++中,有一个stream这个类,所有的I/O都以这个“流”类为基础的,包括我们要认识的文件I/O,stream这个类有两个重要的运算符:1、插入器(<<)向流输出数据。
比如说系统有一个默认的标准输出流(cout),一般情况下就是指的显示器,所以,cout<<"Write Stdout"<<'n';就表示把字符串"Write Stdout"和换行字符('n')输出到标准输出流。
2、析取器(>>)从流中输入数据。
比如说系统有一个默认的标准输入流(cin),一般情况下就是指的键盘,所以,cin>>x;就表示从标准输入流中读取一个指定类型(即变量x的类型)的数据。
在C++中,对文件的操作是通过stream的子类fstream(file stream)来实现的,所以,要用这种方式操作文件,就必须加入头文件fstream.h。
下面就把此类的文件操作过程一一道来。
一、打开文件在fstream类中,有一个成员函数open(),就是用来打开文件的,其原型是:void open(const char* filename,int mode,int access);参数:filename:要打开的文件名mode:要打开文件的方式access:打开文件的属性打开文件的方式在类ios(是所有流式I/O类的基类)中定义,常用的值如下:ios::app:以追加的方式打开文件ios::ate:文件打开后定位到文件尾,ios:app就包含有此属性ios::binary:以二进制方式打开文件,缺省的方式是文本方式。
两种方式的区别见前文ios::in:文件以输入方式打开ios::out:文件以输出方式打开ios::nocreate:不建立文件,所以文件不存在时打开失败ios::noreplace:不覆盖文件,所以打开文件时如果文件存在失败ios::trunc:如果文件存在,把文件长度设为0可以用“或”把以上属性连接起来,如ios::out|ios::binary打开文件的属性取值是:0:普通文件,打开访问1:只读文件2:隐含文件4:系统文件可以用“或”或者“+”把以上属性连接起来,如3或1|2就是以只读和隐含属性打开文件。
C++:流类库与输⼊输出7.2.1 C++的输⼊输出流ios:流基类(抽象类)istream:通⽤输⼊流类和其他输⼊流的基类ostream:通⽤输出流类和其他输出类的基类iostream:通⽤输⼊输出流类和其他输⼊输出流类的基类(以下的派⽣类对象有cin、cout、cerr、clog)ifstream:输⼊⽂件流类ofstream:输出⽂件流类fstream:输⼊输出⽂件流istrstream:输⼊字符串流类ostrstream:输出字符串流类strstream:输⼊输出字符串类iostream_withassign: 通⽤输⼊输出流类和其他输⼊输出流类iostream的的派⽣类7.2.2 预定义的流对象C++中包含⼏个预定义的流对象,它们是标准输⼊流对象cin、标准输出流对象cout、⾮缓冲型的标准出错流对象ceer、缓冲型的标准出错流对象clogcin是istream的派⽣类istream_withassign的对象,它与标准输⼊设备(通常是键盘)相联系。
cout是ostream的派⽣类ostream_withassign的对象,它与标准输出设备(通常是显⽰器)相联系。
ceer是ostream的派⽣类ostream_withassign的对象,它与标准错误输⼊设备(通常是显⽰器)相联系。
clog是ostream的派⽣类ostream_withassign的对象,它与标准错误输⼊设备(通常是显⽰器)相联系。
由于istream和ostream类都在头⽂件iostream中声明的,因此只要在程序中包含头⽂件iostream.h,C++程序开始时这四个标准流对象的构造函数都被⾃动调⽤。
7.2.3 输⼊输出流的成员函数(1)put函数put函数⽤于输出⼀个字符格式:cout.put(char ch)例如:cout.put('A')===cout.put(65)===cout.put(25+40)(2)get函数get函数的功能与提取运算符>>类似,主要不同之处是get函数在读⼊数据时可以包括空⽩字符,⽽后者不可以。
第八章输入输出流(input/output stream)的基本概念及原理8.1 预定义数据类型的输入/输出8.1.1 基本情况及其优点C++输入输出流的优点:(一)重载运算符“<<”和“>>”能以函数重载的形式极大地扩大用途,在输入输出流中充分体现多态性。
C语言的输入/输出系统本来就灵活性大、功能比较完善。
但它有一个较大缺点:无法处理众多的用户自定义数据类型(主要是类及其对象)。
例如,有一个结构类型exampl如下:struct exampl {int j;char str[80];} str_ex;如欲输出此结构对象str_ex的两个成员的内容,因而笼统地使用如下输出语句printf,printf(“%exampl”,str_ex);则将会出现编译错误。
而C++的输出/输入系统则能很好地解决这个问题。
(二)类型安全(type-safe)[例1]C语言输出语句中的类型错误(第一章已看过)#include <stdio.h>void main( ){int i=3;double d=4.4;printf(“%d\t%f\n”, i, d);}运行结果:3 4.400000 对!但如写错为:printf(“%d\t%d\n”, i, d);则编译时不出错,但运行结果错,为:3-26214但在C++中只须写cout<<i<<“”<<d<<endl;而不必写出变量类型!就能得出3 4.4,对!始终不会出错!(三)通过缓存增加功能。
(四)附带优点是书写方便以及显示中没有冗余字符,能自动略去浮点数尾数中的零(但如用户希望显示多余的零,也可以做到)。
C++的输入/输出系统是对流的操作,也即操作数据使其流向对象,或从对象流出。
什么是流?流是从源头到目的的数据流动。
当键入字符时,字符从键盘流入程序中;当将数据写入磁盘文件中时,数据自程序流动至磁盘上。
实验四输入输出流实验课程名:面向对象程序设计(C++)专业班级:学号:姓名:实验时间:实验地点:指导教师:代码分析:1)在输入时调用getline()以换行符作为输入姓名时的结束标志,已达到输入空格的目的2)输出时采用resetiosflags(ios::right)实现结束向左对齐,用setw(8)实现输出域宽为8,使用一系列的格式控制字符来实现输出格式的控制。
2. 重载运算符“<<”和“>>”,使其能够输入一件商品的信息和输出这件商品的信息。
商品的信息由编号、商品名和价格。
假如商品类Merchandise的框架如下:class merchandise{public:Merchandiss();~Merchandiss();friend istream& operator>>(istream& in,Merchandiss& s);friend ostream&operator<<(ostream& out,Merchandiss& s);private:int no;char *name;double price;};要求实现该类,并编写以下的main函数对该类进行操作。
int main(){ Merchandise mer;cin>>mer;cout<<mer;return 0;}实验代码:#include<iostream>using namespace std;class merchandise{out<<s.no<<' '<<<<' '<<s.price<<endl;return out;}int main(){merchandise mer;cin>>mer;cout<<mer;return 0;}实验结果:实验分析:先定义一个商品的类,构造函数定义为无参函数在函数体中将name置为空,其他为0.在重载>>时使用getline函数,输入name以’\n’作为结束标记重载<<时直接输出。