C++的iostream标准库介绍---深入理解io标准库,以及重载性

合集下载

第9章iostream库

第9章iostream库

istringstream类的构造函数为:
istringstream(const char *str); istringstream( );
例如: istringstream st(“12 5.6 hello”);
int a; double b;
st>>a>>b;
cout<<a<<endl<<b;
//12
if(cin!=0)
//cin为false表示读操作失败或遇到文件尾
ios基类定义的状态字有:
ios::badbit 操作无效
ios::goodbit 正常状态 ios::failbit 上次I/O操作失败
ios::eofbit 到达文件尾
可以通过以下成员函数访问当前状态值: int eof( ); 到达文件尾,返回true,否则false
10.2 容器
in>>obj.b; return in;}
int main( )
{data d1(3,8.9); cout<<d1;
return 0;}
第一个参数是ostream 或istream对象的引用,所以只能定义为友元函数。
9.3 文件输入和输出
9.3.1 ofstream流类
ofstream流类对象完成文件的输出,ofstream流类对象的构造函数有: 1、ofstream(char * s,int mode=ios::base_out,int attr=filebuf::openprot); s指向要打开的文件名字符串; mode为打开模式,缺省实参值为输出模式(ios::base_out),还可以为附加模式 (ios::base_app)。若打开的文件不存在,则创建新文件。如果在输出模式下打 开已存在的文件,文件中的数据将被覆盖,若希望保留文件原来的数据,应以 附加模式打开,新数据将添加至文件尾部; 文件打开模式还有: ios::ate 打开文件以便输出,位置指针移到文件末尾(通常用于添加数据); ios::in 打开文件以便输入; ios::trunc 删除文件原来的数据(是ios::out的默认操作) ios::nocreate 如果文件不存在,则文件打开失败 ios::noreplace 如果文件存在,则文件打开失败 ios::binary 以二进制方式打开文件

c++ IOStream

c++ IOStream

c语言的标准输入输出库是stdio.h是一个函数库而不是类库。

其中包括了我们最常使用的scanf printf都是一些独立的全局函数,因为C语言是不支持类的。

c++的标准输入输出库iostream是一个类库,以类的形式组织,使用该库中的类要先引用命名空间:using nam espace std;最常使用的是cin和cout,这两个都是对象,cin是istream类的对象,cout是ostream类的对象,而输入的cin>>与输出时的cout<<中的左移<<与右移>>分别是istream类与ostream类的操作符重载。

iostream库里面创建了3个标准流对象:1cin表示标准输入的istream对象,cin可以使我们从设备读取数据。

2cout表示标准输出的ostream对象,cout可以使我们向设备写入数据。

3cerr表示标准错误的ostream对象,cerr是导出程序错误消息的地方,只能向屏幕设备写数据。

标准的流对象都有默认的设备:cout<<data;cout默认的设备是显示器缓冲区。

cin>>data;cin默认的设备是键盘缓冲区。

iostream库由以下几个库组成:fstream,iom ainip,ios,iosfwd,iostream,istream,ostream, sstream,stream buf,strstream。

istream用来访问操作系统的输入流,ostream访问操作系统的输出流,iostream同时继承了这两个类。

在ostream类中,重载了许多的左移<<操作符,对每种基本数据类型都做了重载,比如&ostream operator<<(ostream&tem p,int source);&ostream operator<<(ostream&tem p,char source);&ostream operator<<(ostream&tem p,char*source);由于以上重载返回的数据类型都是ostream的引用,ostream又可以作为左值,所以可以实现iostream库不仅支持终端设备的输入输出,还支持文件的输入输出,和文件有关的输入输出类声明在fstream头文件中,有三个类负责文件的输入输出1)ifstream类:从istream类派生。

C++的iostream标准库

C++的iostream标准库

下例示例,表示出了rdstate()的用法:
//程序作者:管宁
//站点:
//所有稿件均有版权,如要转载,请务必著名出处和作者
#include <iostream>
using namespace std;
int main()
cin>>a;
cout<<cin.rdstate()<
cin.clear(ios::goodbit);
cout<<cin.rdstate()<
system("pause");
}
通常当我们发现输入有错又需要改正的时候,使用clear()更改标记为正确后,同时也需要使用get()成员函数清除输入缓冲区,以达到重复输入的目的。
string str;
sstr<
sstr>>str;
cout<
//--------string转char[]--------
sstr.clear();//如果你想通过使用同一stringstream对象实现多种类型的转换,请注意在每一次转换之后都必须调用clear()成员函数。
string name = "colinguan";
char cname[200];
sstr<
sstr>>cname;
cout<
system("pause");
}
接下来我们来学习一下输入/输出的状态标志的相关知识,C++中负责的输入/输出的系统包括了关于每一个输入/输出操作的结果的记录信息。这些当前的状态信息被包含在io_state类型的对象中。io_state是一个枚举类型(就像open_mode一样),以下便是它包含的值。

STL(标准模板库)基本概念

STL(标准模板库)基本概念

STL(标准模板库)基本概念⼀、什么是STLSTL(Standard Template Library,标准模板库)的从⼴义上讲分为三类:algorithm(算法)、container(容器)和iterator(迭代器),容器和算法通过迭代器可以进⾏⽆缝地连接。

⼏乎所有的代码都采⽤了模板类和模板函数的⽅式,这相⽐于传统的由函数和类组成的库来说提供了更好的代码重⽤机会。

在C++标准中,STL被组织为下⾯的13个头⽂件:<algorithm>、<deque>、<functional>、<iterator>、<vector>、<list>、<map>、<memory>、<numeric>、<queue>、<set>、<stack> 和<utility>。

STL详细的说六⼤组件– 容器(Container)– 算法(Algorithm)– 迭代器(Iterator)– 仿函数(Function object)– 适配器(Adaptor)– 空间配制器(allocator)使⽤STL的好处1)STL是C++的⼀部分,因此不⽤额外安装什么,它被内建在你的编译器之内。

2)STL的⼀个重要特点是数据结构和算法的分离。

尽管这是个简单的概念,但是这种分离确实使得STL变得⾮常通⽤。

例如,在STL的vector容器中,可以放⼊元素、基础数据类型变量、元素的地址;STL的sort()函数可以⽤来操作vector,list等容器。

1)程序员可以不⽤思考STL具体的实现过程,只要能够熟练使⽤STL就OK了。

这样他们就可以把精⼒放在程序开发的别的⽅⾯。

2) STL具有⾼可重⽤性,⾼性能,⾼移植性,跨平台的优点。

⾼可重⽤性:STL中⼏乎所有的代码都采⽤了模板类和模版函数的⽅式实现,这相⽐于传统的由函数和类组成的库来说提供了更好的代码重⽤机会。

c语言iostream用法

c语言iostream用法

C语言中没有iostream这个库,iostream是C++中的输入输出流库。

如果您想在C++中使用iostream库,请使用以下代码:```C++#include <iostream>using namespace std;int main() {cout << "Hello, World!" << endl;return 0;}```在上面的代码中,`cout`和`endl`都是iostream库中的对象和函数。

`cout`用于输出信息到控制台,而`endl`则表示换行并刷新输出缓冲区。

您可以通过重载`<<`和`>>`运算符来实现自定义类型的输入输出操作。

例如,下面的代码可以实现自定义类型`Person`的输入输出:```C++#include <iostream>using namespace std;class Person {string name;int age;public:Person(string n, int a) : name(n), age(a) {}friend ostream& operator<<(ostream& os, const Person& p) {os << "Name: " << << ", Age: " << p.age << endl;return os;}friend istream& operator>>(istream& is, Person& p) {cout << "Enter name and age: ";is >> >> p.age;return is;}};int main() {Person p("John Doe", 25);cout << p;Person q("", 0);cin >> q;cout << q;return 0;}```在上面的代码中,我们使用了`friend`关键字来声明`operator<<`和`operator>>`为`Person`类的友元函数,这样就可以直接访问`Person`类的私有成员变量了。

c 标准库 的介绍

c 标准库 的介绍

Rust语言的标准库也提供了与C标准 库的交互。通过Rust的FFI(Foreign Function Interface)机制,Rust程 序可以调用C的函数,反之亦然。
03
Java
虽然Java并不直接支持C标准库,但 Java提供了JNI(Java Native Interface)机制,让Java程序可以调 用C/C的函数。JNI需要编写C/C的 “native”方法,这些方法可以与 Java程序进行交互。
等)、网络编程(socket、bind等)。
06
CATALOGUE
C标准库与其他库的对比与整合
与其他C库的对比
01
GNU C库(glibc)
这是在Linux系统下最常见的C库。它包含了大部分POSIX标准所要求的
函数,并且提供了许多Linux特有的函数。
02
musl
这是一个轻量级的C库,主要用于嵌入式系统和某些对内存使用有严格
VS
详细描述
C标准库中的数学库(math.h)包含了一 系列的数学函数,可以用于进行各种数学 计算。这些函数包括三角函数(sine、 cosine、tangent等)、指数函数(exp 、log等)、对数函数(logarithm)等 。
文件操作
总结词
C标准库提供了用于文件操作的函数 ,如打开文件、读取文件、写入文件 等。
函数可以将时间转化为本地时间,mktime()函数可以将本地时间转化为UTC时间。
另外,还有一些函数可以用于处理日期和时间的关系,如`difftime()`函数可以计 算两个时间之间的差值,`strftime()`函数可以根据指定的格式化字符串将时间转 化为字符串等。
随机数生成函数
stdlib.h头文件中包含了一系列用于生成随机数的函数,如rand()函数可以生成一个在[0, RAND_MAX]范围内的随机整数,srand()函数可以设置随

C 的高级特性---函数重载,重写,覆盖

C  的高级特性---函数重载,重写,覆盖
示例8-1-1 重载函数Eat
C++语言采用重载机制的另一个理由是:类的构造函数需要重载机制。因为C++规定构造函数与类同名(请参见第9章),构造函数只能有一个名字。如果想用几种不同的方法创建对象该怎么办?别无选择,只能用重载机制来实现。所以类可以有多个同名的构造函数。
8.1.2 重载是如何实现的?
int x = Function ();
则可以判断出Function是第二个函数。问题是在C++/C程序中,我们可以忽略函数的返回值。在这种情况下,编译器和程序员都不知道哪个Function函数被调用。
所以只能靠参数而不能靠返回值类型的不同来区分重载函数。编译器根据参数为每个重载函数产生不同的内部标识符。例如编译器为示例8-1-1中的三个Eat函数产生象_eat_beef、_eat_fish、_eat_chicken之类的内部标识符(不同的编译器可能产生不同风格的内部标识符)。
{
void foo(int x, int y);
… // 其它函数
}或者写成
extern “C”
{
#include “myheader.h”
… // 其它C头文件
}
这就告诉C++编译译器,函数foo是个C连接,应该到库中找名字_foo而不是找_foo_int_int。C++编译器开发商已经对C标准库的头文件作了extern“C”处理,所以我们可以用#include 直接引用这些头文件。注意并不是两个函数的名字相同就能构成重载。全局函数和类的成员函数同名不算重载,因为函数的作用域不同。例如:
示例8-2-1中,函数Base::f(int)与Base::f(float)相互重载,而Base::g(void)被Derived::g(void)覆盖。

C++的iostream标准库介绍以及对左移与右移运算符的重载

C++的iostream标准库介绍以及对左移与右移运算符的重载

我们从一开始就一直在利用C++的输入输出在做着各种练习,输入输出是由iostream库提供的,所以讨论此标准库是有必要的,它与C语言的stdio库不同,它从一开始就是用多重继承与虚拟继承实现的面向对象的层次结构,作为一个c++的标准库组件提供给程序员使用。

iostream为内置类型类型对象提供了输入输出支持,同时也支持文件的输入输出,类的设计者可以通过对iostream库的扩展,来支持自定义类型的输入输出操作。

为什么说要扩展才能提供支持呢?我们来一个示例。

C++ 代码#include#include <iostream>using namespace std;class Test{public:Test(int a=0,int b=0){Test::a=a;Test::b=b;}int a;int b;};int main(){Test t(100,50);printf("%???",t);//不明确的输出格式scanf("%???",t);//不明确的输入格式cout<//同样不够明确cin>>t;//同样不够明确system("pause");}由于自定义类的特殊性,在上面的代码中,无论你使用c风格的输入输出,或者是c++的输入输出都不是不明确的一个表示,由于c语言没有运算符重载机制,导致stdio库的不可扩充性,让我们无法让printf()和scanf()支持对自定义类对象的扩充识别,而c++是可以通过运算符重载机制扩充iostream库的,使系统能能够识别自定义类型,从而让输入输出明确的知道他们该干什么,格式是什么。

在上例中我们之所以用printf与cout进行对比目的是为了告诉大家,C与C++处理输入输出的根本不同,我们从c远的输入输出可以很明显看出是函数调用方式,而c++的则是对象模式,cout和cin是ostream类和istream类的对象。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

为什么需要iostream我们从一开始就一直在利用C++的输入输出在做着各种练习,输入输出是由iostream库提供的,所以讨论此标准库是有必要的,它与C语言的stdio库不同,它从一开始就是用多重继承与虚拟继承实现的面向对象的层次结构,作为一个c++的标准库组件提供给程序员使用。

iostream为内置类型对象提供了输入输出支持,同时也支持文件的输入输出,类的设计者可以通过对iostream库的扩展,来支持自定义类型的输入输出操作。

由于自定义类的特殊性,在上面的代码中,无论你使用c风格的输入输出,或者是c++的输入输出都不是不明确的一个表示,由于c语言没有运算符重载机制,导致stdio库的不可扩充性,让我们无法让printf()和scanf()支持对自定义类对象的扩充识别,而c++是可以通过运算符重载机制扩充iostream库的,使系统能能够识别自定义类型,从而让输入输出明确的知道他们该干什么,格式是什么。

在上例中我们之所以用printf与cout进行对比目的是为了告诉大家,C与C++处理输入输出的根本不同,我们从c远的输入输出可以很明显看出是函数调用方式,而c++的则是对象模式,cout和cin是ostream类和istream类的对象。

1 iostream: istream 和ostreamC++中的iostream库主要包含下图所示的几个头文件:IOSstream 库fstream iomainipios iosfwdiostreaistreammostream sstreamstreambstrstreamuf我们所熟悉的输入输出操作分别是由istream(输入流)和ostream(输出流)这两个类提供的,为了允许双向的输入/输出,由istream和ostream派生出了iostream类。

类的继承关系见下图:iostream库定义了以下三个标准流对象:1cin,表示标准输入(standard input)的istream类对象。

cin使我们可以从设备读入数据。

2cout,表示标准输出(standard output)的ostream类对象。

cout使我们可以向设备输出或者写数据。

3cerr,表示标准错误(standard error)的osttream类对象。

cerr是导出程序错误消息的地方,它只能允许向屏幕设备写数据。

输出主要由重载的左移操作符(<<)来完成,输入主要由重载的右移操作符(>>)完成:4>>a表示将数据放入a对象中。

5<<a表示将a对象中存储的数据拿出。

这些标准的流对象都有默认的所对应的设备,见下表:C++对象名设备名称C中标准设备名默认含义cin 键盘stdin 标准输入cout 显示器屏幕stdout 标准输出cerr 显示器屏幕stderr 标准错误输出上表中的意思表明cin对象的默认输入设备是键盘,cout对象的默认输出设备是显示器屏幕。

那么原理上C++有是如何利用cin/cout对象与左移和右移运算符重载来实现输入输出的呢?下面我们以输出为例,说明其实现原理:6cout是ostream类的对象,因为它所指向的是标准设备(显示器屏幕),所以它在iostream头文件中作为全局对象进行定义。

7ostream cout(stdout);//其默认指向的C中的标准设备名,作为其构造函数的参数使用。

8在iostream.h头文件中,ostream类对应每个基本数据类型都有其友元函数对左移操作符进行了友元函数的重载。

o ostream& operator<<(ostream &temp,int source);o ostream& operator<<(ostream &temp,char *ps);o... 等等一句输出语句:cout<<"/andxie99";,事实上调用的就是ostream& operator<<(ostream &temp,char *ps);这个运算符重载函数,由于返回的是流对象的引用,引用可以作为左值使用,所以当程序中有类似cout<<"/andxie99"<<"白纸人生";这样的语句出现的时候,就能够构成连续输出。

由于iostream库不光支持对象的输入输出,同时也支持文件流的输入输出,所以在详细讲解左移与右移运算符重载之前,我们有必要先对文件的输入输出以及输入输出的控制符有所了解。

2 fstream: ifstream 和ofstream和文件有关系的输入输出类主要在fstream.h这个头文件中被定义,在这个头文件中主要被定义了三个类,由这三个类控制对文件的各种输入输出操作,他们分别是ifstream、ofstream、fstream,其中fstream类是由iostream类派生而来,他们之间的继承关系见下图所示。

由于文件设备并不像显示器屏幕与键盘那样是标准默认设备,所以它在fstream.h头文件中是没有像cout那样预先定义的全局对象,所以我们必须自己定义一个该类的对象,我们要以文件作为设备向文件输出信息(也就是向文件写数据),那么就应该使用ofstream类。

ofstream类的默认构造函数原形为:ofstream::ofstream(constchar *filename,int mode = ios::out,int openprot = filebuf::openprot);∙filename:要打开的文件名∙mode:要打开文件的方式∙prot:打开文件的属性其中mode和openprot这两个参数的可选项表见下表:mode属性表ios::app 以追加的方式打开文件ios::ate 文件打开后定位到文件尾,ios:app就包含有此属性ios::bina以二进制方式打开文件,缺省的方式是文本方式。

两种方式的区别见前文ryios::in 文件以输入方式打开ios::out 文件以输出方式打开ios::trun如果文件存在,把文件长度设为0c可以用“或”把以上属性连接起来,如ios::out|ios::binary。

openprot属性表属含义性0 普通文件,打开访问1 只读文件2 隐含文件4 系统文件可以用“或”或者“+”把以上属性连接起来,如3或1|2就是以只读和隐含属性打开文件。

文件使用完后可以使用close成员函数关闭文件。

ios::app为追加模式,在使用追加模式的时候同时进行文件状态的判断是一个比较好的习惯。

在定义ifstream和ofstream类对象的时候,我们也可以不指定文件。

以后可以通过成员函数open()显式的把一个文件连接到一个类对象上。

我们在简单介绍过ofstream类和ifstream类后,我们再来看一下fstream类,fstream类是由iostream派生而来,fstream类对象可以同对文件进行读写操作。

示例代码如下:#include <iostream> #include <fstream> usingnamespace std; int main() { fstream myfile; myfile.open("c://1.txt",ios::out|ios::app,0); if(!myfile) { cout<<"文件写错误,文件属性可能为只读!"<<endl; system("pause"); exit(1); } myfile<<"白纸人生"<<endl<<"网址:"<<"/andxie99"<<endl; myfile.close(); myfile.open("c://1.txt",ios::in,0); if(!myfile) { cout<<"文件读错误,文件可能丢失!"<<endl; system("pause"); exit(1); } char ch; while(myfile.get(ch)) { cout.put(ch); } myfile.close(); system("pause"); }由于fstream类可以对文件同时进行读写操作,所以对它的对象进行初始话的时候一定要显式的指定mode和openprot参数。

接下来我们来学习一下串流类的基础知识,什么叫串流类?3 strstream: ostrstream 和istrstream简单的理解就是能够控制字符串类型对象进行输入输出的类,C++不光可以支持C++风格的字符串流控制,还可以支持C风格的字符串流控制。

我们先看看看C++是如何对C风格的字符串流进行控制的,C中的字符串其实也就是字符数组,字符数组内的数据在内存中的位置的排列是连续的,我们通常用char str[size]或者char *str的方式声明创建C风格字符数组,为了能让字符数组作为设备并提供输入输出操作,C++引入了ostrstream、istrstream、strstream这三个类,要使用他们创建对象就必须包含strstream.h头文件。

∙istrstream类用于执行C风格的串流的输入操作,也就是以字符串数组作为输入设备。

∙ostrstream类用于执行C风格的串流的输出操作,也就是一字符串数组作为输出设备。

∙strstream类同时可以支持C风格的串流的输入输出操作。

istrstream类是从istream(输入流类)和strstreambase(字符串流基类)派生而来,ostrstream是从ostream(输出流类)和strstreambase(字符串流基类)派生而来,strstream 则是从iostream(输入输出流类)和和strstreambase(字符串流基类)派生而来。

他们的继承关系如下图所示:串流同样不是标准设备,不会有预先定义好的全局对象,所以不能直接操作,需要通过构造函数创建对象。

类istrstream的构造函数原形如下:istrstream::istrstream(constchar *str,int size);参数1表示字符串数组,而参数2表示数组大小,当size为0时,表示istrstream类对象直接连接到由str所指向的内存空间并以/0结尾的字符串。

相关文档
最新文档