C ++ 객체 지향 프로그래밍 연구 노트 (8)

C ++ 클래스 라이브러리 입출력 스트림

C ++ 흐름 개요

C ++ 입출력 스트림

데이터가 추상의 목적 소스로부터의 정보 흐름을 C ++와 의미, 그것은 생산자와 데이터의 소비자 사이의 링크를 확립 할 책임이 있으며, 데이터의 흐름을 관리 할 수
는 입력 동작라는 스트림으로부터 추출 데이터를 추가 데이터 스트림 출력 동작이라고

C ++에서 O는 바이트 스트림의 형태로 구현되며, 파일 및 문자열은 정렬 된 바이트 스트림으로 간주 할 수 있으며, 스트림 파일 문자열 스트림이라고

은 C ++에서의 I / O 스트림 라이브러리 스트리밍 클래스라고 입력 및 출력, 많은 클래스를 포함, 객체 클래스 정의 스트림은 스트림이라고하는 객체

스트림 오브젝트의 입출력

C ++ 컴파일러 시스템 입출력 iostream 라이브러리 제공
공통 헤더 파일 보유

iostream //包含了对输入输出流进行操作所需的基本信息,使用cin、cout等流对象进行针对标准设备的I/O操作时,需包含此头文件
fstream  //用于用户管理文件的I/O操作。使用文件流对象进行针对磁盘文件的操作时,需包含此头文件
strstream//用于字符串流的I/O操作。使用字符串流对象进行针对内存字符串空间的I/O操作时,需包含此头文件
iomanip  //用于输入输出的格式控制。在使用setw、fixed等大多数操作符进行格式控制时,需包含此头文件
입출력 스트림 클래스

나는 / O 스트림 클래스 라이브러리는 일반적으로 사용되는

클래스 이름 설명 헤더
IOS 흐름의 기본 클래스 iostream
istream로 입력 스트림과 다른 입력 스트림 클래스 범용 기본 클래스 iostream
ostream에 출력 스트림 클래스 일반적인 기본 클래스와 다른 출력 스트림 iostream
iostream 기본 클래스 범용 입출력 스트림 클래스와 다른 입력 및 출력 스트림 iostream
ifstream 파일 스트림 클래스를 입력 fstream
ofstream 출력 파일 스트림 클래스 fstream
fstream 입력 및 출력 파일 스트림 클래스 fstream
istrstream 입력 문자열 스트림 클래스 strstream
ostrstream 출력 문자열 스트림 클래스 strstream
strstream 문자열 입력 및 출력 스트림 클래스 strstream
미리 정의 된 스트림 오브젝트

스트림은 출력 장치와 연관된 스트림 오브젝트라고 입력 장치, 스트림 오브젝트와 연관된 입력 스트림 오브젝트, 스트림 오브젝트 클래스 정의 오브젝트라고 출력 스트림 오브젝트라고

C ++은 미리 정의 같은 방해 표준 입력 스트림 오브젝트 (CIN), 표준 출력 스트림 오브젝트 COUT 표준 오차 버퍼 스트림 오브젝트의 표준 오차 cerr 버퍼링 스트림 오브젝트의 스트림 오브젝트를 포함

해당 출력 디스플레이 장치에 직접 관계없이 cerr 및 막힘, cerr 버퍼 사이의 차이점은, 버퍼가 꽉 또는 표시 장치 ENDL에 출력하는 경우에 상기 버퍼에 저장된 정보 막힘

상기 출력 스트림의 입력 부재 함수

COUT 및 삽입 연산자 제외 C ++ 프로그램은 "<<"는 입력 CIN과 출력 및 구현 추출 연산자 ">>"달성하기 위해, 여전히 멤버 함수 존재

풋 기능

문자를 출력하는 기능을 넣고, 다음과 같은 형식cout.put(char c)

cout.put('A');
cout<<'A'; 

输出结果为
AA
기능을 얻을

문자가 공백 거부 기본 경우 get 함수 공백 문자를 포함 할 때 데이터를 판독하는 것을 제외하고, 추출 조작, 유사 ">>"기능 추출 연산자를 얻을
형식cin.get(ch)

캐릭터가 캐릭터 가변 채널에 할당 (빈 포함) 입력 스트림으로부터 판독 될 때 성공적으로 오류 값 0 복귀 비제로 복귀 행

char a,b;
cin>>a;
cin.get(b);
cout<<a<<' '<<b<<endl;

当输入aa时,文件输出
a a
의 getline 함수

의 getline 호출 양식

cin.getline(字符数组,字符个数n,终止标示符);
或
cin.getline(字符指针,字符个数n,终止标示符);

가 종료 문자 '\ n'마지막 삽입 종료 플래그 문자열의 입력의 조기 종료를 지정한 판독 동안 발생 포인터 해당 문자 또는 문자 배열에 할당 된 입력 스트림으로부터 판독 N-1 문자

참고
만 입력 문자 데이터로 사용될 1.cin.getline
2.cin.getline 포함한 공간을 포함하는 일련의 문자로 읽을 수있는

char s[100005];
cin.getline(s,10); //输入:aahcihbiuah
cout<<s<<endl;     //输出:aahcihbiu
cin.getline(s,5,'\0');  //输入:123456
cout<<s<<endl;          //输出:1234
cin.getline(s,5,'2');  //输入:123456
cout<<s<<endl;          //输出:1
cin.getline(s,13,'a');  //输入:123456789 1234
cout<<s<<endl;          //输出:123456789 12
기능을 무시

의 형태로 호출 cin.ignore(n,终止字符)
기능이 무시 될 때 스킵 입력 스트림 n 개의 문자 (기본값은 1) 기능, 또는 지정된 종료 문자의 조기 종료의 경우에 (기본값은 EOF이다)

char s[100005];
cin.ignore(10); //输入:aahcihbiuah
cin>>s;
cout<<s<<endl;  //输出:h
cin.ignore(10,'h'); //输入:aahcihbiuah
cin>>s;
cout<<s<<endl;  //输出:cihbiuah

입력 및 출력 유형의 미리

입출력 수단이 소정의 기준 C ++ 형 O 사전 정의 된 유형

운영자 삽입 및 추출 사업자

일반 사용 형식

cin>>变量;    //输入
cout<<变量;   //输出
"<<"연산자를 삽입

오퍼레이터 iostream 과부하에 "<<"왼쪽 시프트 연산자 자체 삽입 원형이며

ostream &operator<<(ostream &类型名)
추출 연산자 ">>"

추출 연산자 ">>"자체 연산자 iostream에 과부하 우측 시프트하고, 프로토 타입은

istream &operator>>(istream &类型名)

참고 :
기본적으로 운영자 ">>"으로 공백 건너 뜁니다

입력 포맷 출력 제어

C는 ++ 제어 방법에있어서, 입력 및 출력 형식의 두 가지 제공
클래스의 유량 제어 부재의 기능은 관련 포맷 IOS 및 다른 머니퓰레이터 제어 형식라는 함수의 특별한 형태를 사용하는 사용 제어 프로그레시브 형식

유량 제어 부재의 기능을 이용하여 포맷

입력 및 출력 부재 함수 흐름 제어

스트림 멤버 함수 기능
setf의 (플래그) 설정 상태 플래그
unsetf (플래그) 분명히 상태 플래그
폭 (N) 필드 n 비트 필드 설정 폭
채우기 (숯불 채널) 설정 채우기 문자 채널
정밀도 (N) 십진수 형태 통상 N에서 N 비트 정밀도의 실제 설정이 유효한 디지털 출력 고정 (소수점의 고정 된 수) 또는 과학 (지수)를 나타내고 n이 소수점 형태의 출력을 나타낸다

상태 플래그가 추가 이전에 참조, 열거 값으로 IOS 클래스에 정의되어있다 "는게을 ::"

국가 플래그 기능 입력 / 출력
IOS :: skipws 스킵 입력 공백 기입
IOS :: 왼쪽 넓은 필드 내에서-정당화 왼쪽의 출력 데이터 기입
IOS :: 권리 넓은 필드에서 오른쪽 정렬의 출력 데이터 기입
IOS :: 내부 데이터 심볼의 비트는 데이터 심볼들 및 필러 사이의 정렬, 오른쪽 정렬 데이터 자체를 왼쪽 기입
IOS :: 12월 정수베이스 (10)를 설정 입력 / 출력
IOS :: 10월 8 기수의 정수를 설정 입력 / 출력
IOS :: 진수 정수베이스 (16)를 설정 입력 / 출력
IOS :: showbase 출력 심볼 표시 기수 정수 (8 진수 0 시작, 0X와 진수 시작) 입력 / 출력
IOS :: showpoint 소수점과 부동 소수점 숫자 때 수출
IOS :: 대문자 E 과학적 표기법 형식과 대문자를 사용할 때 진수 출력 표현 수출
IOS :: showpos 양의 정수 전에 A '+'기호 수출
IOS :: 과학 디스플레이는 과학적 표기법을 사용하여 부동 소수점 숫자 수출
IOS :: 고정 부동 소수점 형식 표시 수출
IOS :: unitbuf 모든 출력 동작의 완료 직후에 흘러 고침 수출
IOS :: STDIO 표준 출력과 리프레시 동작의 완료 후 즉시 출력 열려진 수출

1. 설정 상태의 일반적인 포맷을 나타낸다

流对象.setf(ios::状态标志);

주 :
(1) 상기 상태 플래그가 전방 참조가 "IOS ::"를 추가하도록 할 때, 클래스 IOS에서 열거 된 값으로 정의
| 분리 '2. 다중 중간 사용 또는 조작 할 수 마킹되면

2. 지우기 마크는 국가의 일반적인 형식입니다

流对象.unsetf(ios::状态标志);

3. 와이드 필드의 일반 형식

流对象.width(int n);

참고 : 각 작업 후 작업에 한 번만 유효 당 제공되는 넓은 필드, 0 폭 기본 도메인에 넓은 필드 되돌리기

4. 정밀도 실수 일반적인 형식은

流对象.width(int n);

십진수 형태 통상 N에서 N 비트 정밀도의 실제 설정이 유효한 디지털 출력 고정 (소수점의 고정 된 수) 또는 과학 (지수)를 나타내고 n이 소수점 형태의 출력을 나타낸다

例:

    cout.setf(ios::right | ios::fixed);
    cout.width(10);
    cout<<"1234"<<endl; //域宽为10
    cout<<"1234"<<endl; //域宽为0
    double PI=acos(-1.0);
    cout.precision(10);
    cout<<PI<<endl; //固定小数位数形式
    cout.unsetf(ios::fixed);
    cout<<PI<<endl; //普通十进制小数形式
    cout.setf(ios::scientific);
    cout<<PI<<endl; //指数形式

    输出结果
              1234
    1234
    3.1415926536
    3.141592654
    3.1415926536e+000

5.填充字符的一般格式为

流对象.fill(char c);

作用为当域宽不满时输出字符c来填充,默认状态下为空格

例:

    cout.setf(ios::right | ios::fixed);
    cout.width(10);
    cout.fill('c');
    cout<<1<<endl;

    输出结果
    ccccccccc1
使用操纵符进行格式控制

C++除了可以使用ios类中有关格式控制的流成员函数进行格式控制,还可以使用称为操纵符的特殊类型函数进行格式控制。

所有不带形参的操纵符都定义在头文件iostream.h上,带形参的则定义在头文件iomanip.h上

C++预定义的操纵符

操纵符 功能 输入/输出
ws 跳过输入开头的空白符 输入
endl 输出换行符并刷新输出流 输出
ends 插入一个空字符null 输出
flush 刷新输出流 输出
dec 设置整数基数为10 输入/输出
oct 设置整数基数为8 输入/输出
hex 设置整数基数为16 输入/输出
setbase(n) 设置整数基数为n(n=0,8,10,16),默认为0,即以十进制输出 输入/输出
setfill(c) 设置填充字符c,默认为空格 输出
setprecision(n) 设置实数精度为n位,在普通十进制小数形式输出时n代表有效数字,在fixed(固定小数位数)或scientific(指数)形式输出时n代表小数位数 输出
setw(n) 设置字段域宽为n位 输出
setiosflags(f) 设置状态标志f 输入/输出
resetiosflags(f) 清除状态标志f 输入/输出
操纵符 功能
setiosflags(ios::left) 输出数据在本域宽范围内左对齐
setiosflags(ios::right) 输出数据在本域宽范围内右对齐
setiosflags(ios::fixed) 用定点格式显示浮点数
setiosflags(ios::scientific) 用科学表示法显示浮点数
setiosflags(ios::showpos) 正整数前显示'+'符号
setiosflags(ios::uppercase) 以科学表示法格式E和以十六进制输出字符时用大写表示

    cout<<setw(10)<<1234<<2345<<endl;
    cout<<setprecision(10)<<setiosflags(ios::fixed)<<acos(-1.0)<<endl;
    cout<<setprecision(10)<<acos(-1.0)<<endl;
    cout<<setprecision(10)<<resetiosflags(ios::fixed)<<acos(-1.0)<<endl;
    cout<<setw(10)<<setfill('c')<<1234<<endl;
    

    输出结果
          12342345
    3.1415926536
    3.1415926536
    3.141592654
    cccccc1234
使用用户自定义操纵符进行格式控制

如为输出流定义操纵符函数,形式如下

ostream &操纵符名 (ostream &stream)
{
    自定义代码
    return stream;
}

如为输如流定义操纵符函数,形式如下

istream &操纵符名 (istream &stream)
{
    自定义代码
    return stream;
}


ostream &outputd(ostream &stream)
{
    stream<<setprecision(10)<<setiosflags(ios::fixed);
    return stream;
}
int main()
{
    cout<<outputd<<acos(-1.0)<<endl;
    return 0;
}

输出结果为
3.1415926536
用户自定义类型的输入输出

C++通过重载运算符">>"和"<<"来实现用户自定义类型的输入输出

重载插入运算符

定义插入运算符"<<"重载函数的一般格式如下

ostream &operator<< (ostream &out,user_name& obj)
{
    out<<obj.item1;
    ......
    out<<obj.itemn;
    return out;
}

user_name为用户自定义的类型名,out是ostream类对象的引用,obj为用户自定义的类型名user_name的引用,item1、.......itemn为用户自定义类型中的数据成员
重载插入运算符函数不能是所操作的类的成员函数,但可以是该类的友元函数或普通函数

重载提取运算符

定义提取运算符">>"重载函数的一般格式如下

istream &operator>> (istream &in,user_name& obj)
{
    in>>obj.item1;
    ......
    in>>obj.itemn;
    return in;
}

user_name为用户自定义的类型名,in是istream类对象的引用,obj为用户自定义的类型名user_name的引用,item1、.......itemn为用户自定义类型中的数据成员
重载提取运算符函数不能是所操作的类的成员函数,但可以是该类的友元函数或普通函数

文件的输入输出

C++将文件是为字符序列,即文件是由一个一个字符数据顺序组成的,根据数据的组织形式,文件可以分为文本文件和二进制文件。文本文件又称ASCII文件,他的每个字节存放一个ASCII代码,代表一个字符。二进制文件则是把内存中的数据,按其在内存中的存储形式原样写到磁盘中存储。

C++中引入流式文件的概念,即文件一律视为字符构成的序列,即字符流

文件的打开与关闭

C++中要进行文件的操作,首先要创造一个流对象,然后将这个流对象与文件相关联,即打开文件,此后才能进行文件的读写操作,最后关闭文件。

文件的打开

c++打开一个文件,即建立一个流对象与文件相关联,关闭一个文件,就是取消这种关联

用于文件输入输出的文件流类

类名 说明 功能
ifstream 输入文件流类 用于文件输入
ofstream 输出文件流类 用于文件输出
fstream 输入输出文件流类 用于文件输出/输入

头文件为fstream.h

使用open函数打开文件的一般形式

文件流对象.open(文件名,打开方式);

文件名可包括路径,默认路径为当前目录
打开方式见下表

方式 功能
ios::app 打开一个输出文件,用于将数据添加至文件尾部
ios::ate 打开一个现存文件,将文件指针移至文件末尾
ios::in 打开一文件,以便进行输入
ios::nocreate 打开一个文件,若文件不存在,则打开失败
ios::noreplace 打开一个文件,若文件存在,则打开失败
ios::out 打开一文件,以便进行输出
ios::trunc 打开一个文件,若文件存在,则删除其中所有数据,如不存在,则建立新文件
ios::binary 以二进制方式打开一个文件,默认问文本文件

注意:
1.使用"ios::app"时,文件必须存在,打开时文件指针位于文件末尾,此方式只能用于输出
2.使用"ios::ate"时,打开时文件指针位于文件末尾,数据可写入文件任意位置
3.使用"ios::in"时,文件必须存在,此方式只能用于输入,使用ifstream时默认使用该方式
使用"ios::out"时,此方式只能用于输出,使用ofstream时默认使用该方式
4.新版本I/O类库中不提供ios::nocreate 与 ios::noreplace
5.若指定"ios::out"方式,且未指定"ios::ate"或"ios::app"方式,则隐含"ios::trunc"方式
6.当文件需要使用多种方式打开时,使用"|"操作符组合多种方式
7.可以通过定义文件流对象时指定参数,调用构造函数来实现打开文件功能
8.当文件打开操作失败,流对象的值为0

文件的关闭

使用close函数关闭文件,即将文件与文件流对象脱钩

使用close函数关闭文件的一般形式

文件流对象.close();

例: 使用文件流输出字符串

    string a="1dascipan";
    ofstream out;
    out.open("1.txt",ios::out);
    out<<a<<endl;
    out.close();
二进制文件的读写

二进制文件的读写大致与文件读写一致,但要求在打开文件使用ios::binary以二进制形式传送和存储

二进制文件进行读写有两种方式,一是使用函数getput,另一种是使用函数readwrite

1.使用函数getput

例: 使用二进制方式编写一个二进制文件并读取

void bt_wirte()
{
    ofstream outb("out.dat",ios::binary);
    for(char i='a';i<='z';i++) outb.put(i);
    outb.close();
}

void bt_read()
{
    ifstream inb("out.dat",ios::binary);
    char c;
    while(inb.get(c)) cout<<c;
    cout<<endl;
    inb.close();
}

int main()
{
    bt_wirte();
    bt_read();
    return 0;
}

输出结果
屏幕输出
abcdefghijklmnopqrstuvwxyz
并输出一个名为out.dat的二进制文件

2.使用函数readwrite
c++提供了函数readwrite用于读写一个数据块
调用格式如下

inf.read(char *buf,int len);
outf.write(const char *buf,int len);

read是流类istream中的成员函数,有两个参数,第一个参数buf为指针,指向读入数据存储空间的起始地址,第二个参数len为读入字节数。read的功能是从inf关联的文件中读取len个或读至EOF的字节,将其存入buf指向的内存空间中

write是流类ostream中的成员函数,有两个参数,第一个参数buf为指针,指向数据存储空间的起始地址,第二个参数len为输出字节数。read的功能是将其存入buf指向的内存空间中字节开始的len个字节的数据写入outf所关联的文件中

注意:
指针默认的数据类型为char * ,若为其他数据类型,则需要进行转换,并通过sizeof函数确定读入字符数

例:

void bt_wirte()
{
    char s[100]="why";
    ofstream outb("out.dat",ios::binary);
    outb.write((char *)&s,sizeof(s));
    outb.close();
}

void bt_read()
{
    char s[100];
    ifstream inb("out.dat",ios::binary);
    inb.read((char *)&s,sizeof(s));
    cout<<s<<endl;
    inb.close();
}

int main()
{
    bt_wirte();
    bt_read();
    return 0;
}

输出结果
屏幕输出
why
并输出一个名为out.dat的二进制文件

3.检测文件结束
采用文件流读写文件时,可通过成员函数eof()实现检测文件结束
一般形式为

ifstream inf;
......
if(!inf.eof()) ......

当返回值为零时,表示为到达文件尾,非零时,表示到达文件尾

也可通过检测文件流对象是否为零,若为零则表示文件结束

4.二进制文件的随机读取
前面的文件操作是按一定顺序来进行读写的,因此称为顺序文件,C++在类istream和类ostream定义了几个与文件指针相关的成员函数,使其能实现文件的随机读取

istream

tellg();                //返回输入文件读指针的位置
seekg(文件中的位置);      //将输入文件读指针移至指定的位置
seekg(位移量,参照位置);    //以参照位置为基准移动若干字节

文件中的位置和位移量都是long型整数,以字节为单位,
参照位置可为

ios::beg        //文件开头
ios::cur        //文件指针当前位置
ios::end        //文件末尾

ostream

tellp();                //返回输出文件读指针的位置
seekp(文件中的位置);      //将输出文件读指针移至指定的位置
seekp(位移量,参照位置);    //以参照位置为基准移动若干字节

若为即可输出也可输入的文件,则```seekg```与```seekg```都可使用

####命名空间和头文件命名规则

#####命名空间
命名空间实际上是一个由程序设计者命名的内存区域,程序设计者可根据需要指定一些有名字的命名空间,将各命名空间中声明的标识符与该命名空间标识符相关联。

声明命名空间的一般形式为

namespace NS
{
.......
}
```
namespace是定义命名空间必须的关键字,NS 是命名空间的名字,花括号为命名空间的作用域

추천

출처www.cnblogs.com/springfield-psk/p/12080946.html