一:C++输入输出包含下面3个方面
(一)标准I/O
对系统指定的
标准设备的输入和输出。即从键盘输入数据,输出到显示器屏幕。这种输入输出称为标准的输入输出。
(二)文件I/O
以
外存磁盘文件为对象进行输入和输出,即从磁盘文件输入数据,数据输出到磁盘文件。以外存文件为对象的输入输出称为文件的输入输出
(三)串I/O
对
内存中指定的空间进行输入和输出。通常指定一个字符数组作为存储空间(实际上可以利用该空间存储任何信息)。这种输入和输出称为字符串输入输出
二:I/O类库中常用流类
(一)类名及作用
(二)类关系
ios是抽象基类,由它派生出istream类和ostream类,两个类名中第1个字母i和o分别代表输入(input)和输出(output)。
istream类支持输入操作,
ostream类支持输出操作,
iostream类支持输入输出操作。
iostream类是istream类和ostream类通过多重继承而派生的类。
C++对文件的输入输出需要用ifstrcam和ofstream类,两个类名中第1个字母i和o分别代表输入和输出,第2个字母f代表文件 (file)。ifstream支持对文件的输入操作, ofstream支持对文件的输出操作。类ifstream继承了类istream,类ofstream继承了类ostream,类fstream继承了 类iostream。
三:标准I/O流:cin,cout,cerr,clog
对象
含义
对应设备
对应的类
c语言中相应的标准文件
cin
标准输入流
键盘
istream_withassign
stdin
cout
标准输出流
屏幕
ostream_withassign
stdout
cerr
标准错误流
屏幕
ostream_withassign
stderr
clog
标准错误流
屏幕
ostream_withassign
stderr
(一)标准输入流
1:常见函数
cin.get() //获取字符,指定个数字符(字符串),按照字符截取字符串
cin.getline() //获取一行字符串(允许空格)
cin.ignore()
cin.peek()
cin.putback()
cin.get()的使用
1:cin.get() 读取一个字符
char a;
a = cin.
get();
cout << a << endl;
或者
char a;
cin.get(a);
cout << a << endl;
2:cin.get()读取指定个数字符(字符串)
char a[
5];
cin.get(a,
5); //虽然我们获取5个,但是当我们输入5个及以上,内部函数只会获取4个字符,最后加上'\n'
cout << a << endl;
3:cin.get()获取字符串(根据指定字符截止)
char a[
10];
cin.get(a,10,'a'); //遇到字符'a'则结束
cout << a << endl;
4:cin.get()更多用法可以查看源码定义和声明
cin.getline()的使用 :同get()方法的后面两种一致
1.方法一:获取指定个数字符
char a[
10];
cin.getline(a,7);
cout << a << endl;
2.方法二:按照指定字符截取获取字符串
char a[
10];
cin.getline(a,7,
'z');
cout << a << endl;
注意:getline两种用法区别《重点》
_Myt& __CLR_OR_THIS_CALL getline(_Elem *
_Str, streamsize _Count)
{ // get up to _Count characters into NTCS, discard newline 会将一行数据到'\n'之前全部取出处理,会处理更多的缓冲区数据
return (getline(_Str, _Count, _Myios::
widen('\n')));
}
_Myt& __CLR_OR_THIS_CALL getline(_Elem *
_Str,
streamsize _Count, _Elem _Delim)
{ // get up to _Count characters into NTCS, discard _Delim 只会按照指定字符截取字符串,所以不会获取所有缓冲区数据
cin.ignore()的使用
1.缓冲区引入《重点》
键盘输入和应用程序处理之间存在输入缓冲区
应用程序和设备磁盘文件之间存在输出缓冲区
例如图中输入字符串先是放入缓冲区中,只取走其中部分字符串。其余字符串依旧存在缓冲区中,若是继续获取字符,则会先将之前剩余的字符串取出(而这一部分可能是我们不需要的)
char a[
10];
cin.getline(a,7,
'z');
cout << a <<
endl;
cin.getline(a, 7,
'f');
cout << a <<
endl;
system("pause");
注意:若是想取走缓冲区剩余字符。可以使用cin.getline()取走所有剩余数据就可以了
2.cin.ignore()可以用于清除(忽略)缓冲区剩余内容指定个数
char a[
10];
cin.getline(a,7,
'z');
cout << a <<
endl;
cin.ignore(); //默认是忽略一个字符
cin.getline(a,
7,
'f');
cout << a << endl;
cin.ignore(
5);
//忽略5个字符
cin.peek()的使用:读缓冲区中下一个字符,但是不将其取走
char a[
10];
char ch;
ch =
cin.peek();
cout << ch <<
endl;
cin.getline(a, 5);
cout << a << endl;
cin.putback()的使用:在缓冲区前面插入一个字符
char a[
10];
cin.get(a,
5);
cout << a <<
endl;
cin.putback('A');
cin.getline(a, 5);
cout << a << endl;
更多方法查看手册或者看源码即可
(二)标准输出流
1.输出流控制符
2.用于控制输出格式的流成员函数
3.设置格式状态的格式标志
4.案例使用一 (double浮点型)
double a =
123.45678910;
cout << a << endl;
//默认6位有效数 123.456
cout << setprecision(
9) <<a<< endl;
//9位有效数 123.456789
/***********浮点数******************/
cout << setprecision(
7);
//浮点数以定点形式输出,精度变为小数点保留位数
cout << setiosflags(ios::
fixed) << a << endl;
//123.4567891
cout << setiosflags(ios::
fixed) << setprecision(
8) << a << endl;
//123.45678910
cout << setprecision(
4);
cout << setiosflags(ios::scientific) << a;
//设置浮点数以科学计数法形式显示 0x1.edd4p+6
5.案例使用二(int整型):注意setw域宽只对后面一个输出有效
int a =
123456;
cout << a <<
endl;
cout << hex <<a<< endl;
//16进制显示
cout << setiosflags(ios::uppercase) << a << endl;
//16进制字母大写
cout << setw(
10) << endl;
//设置域宽 右对齐
cout << setfill(
'*') << a << endl;
//右对齐,域宽10,空白填充*
cout << setw(
10) << setfill(
'^');
//设置域宽--->注意setw域宽只对后面一个输出有效
cout << setiosflags(ios::left) << a << endl;
//左对齐
//想显示+号,需要在10进制下
cout << dec<<setw(
10)<<setfill(
'%');
cout << setiosflags(ios::showpos) << a << endl;
//设置显示+号
6.注意点
1.成员函数width-->
cout.width()
setw--->cout<<
setw()
只对其后的第一个输出项有效
2.格式状态分5组,每组只有一个有效(互斥)例如:dec,oct,hex设置多个只有后面那个有效
3.可以使用
'|'一次设置多个状态
四:文件I/O
ifstream类,它是从istream类派生的,用来支持从磁盘文件的输入。
ofstream类,它是从ostream类派生的,用来支持向磁盘文件的输出。
fstream类,它是从iostream类派生的,用来支持对磁盘文件的输入输出。
(一)状态模式
文件输入输出设置方式
注意:有些属性是互斥的,使用时注意
例如:app和trunc--->app是在文件末尾加入,而trunc是清空文件查询写入。功能互斥,用于打开文件会打开失败。
注意:打开文件时,所有打开方式,基本都是:若是文件不存在则自动创建
文件属性
属性 含义0 普通文件,打开访问1只读文件2隐含文件3系统文件
(二)案例使用:写入文件并读取数据
#include <iostream>
#include <fstream>
void main()
{
char info[
100];
cin.getline(info, 100);
//写入数据
ofstream ofile;
ofile.open("D:\\1\\io2.txt", ios::app|ios::trunc);
//以追加和创建方式打开 默认是普通文件
if (!
ofile)
{
cout <<
"ofile open failure" <<
endl;
}
else
{
ofile << info;
//写入普通数据
ofile.close();
//关闭文件
}
memset(info, 0,
100);
//初始化空
//读取数据
ifstream ifile;
ifile.open("D:\\1\\io2.txt", ios::
in);
//读取文件 0是默认普通文件,可以像上面一样不写
if (!
ifile.is_open())
{
cout <<
"open failure" <<
endl;
}
else
{
ifile.getline(info, 100);
ifile.close();
cout << info <<
endl;
}
system("pause");
}
(三)案例使用:二进制文件操作read,write
对二进制文件的读写主要使用istream中的write和read方法来实现
istream& read(
char* buf,
int len)
ostream& write(
char* buf,
int len)
typedef
struct
{
char name[
10];
bool sex;
int age;
}Stu;
void main()
{
//结构体操作
Stu s,s2;
strcpy(s.name, "fagfwa");
s.sex =
true;
s.age =
18;
//写入二进制文件
ofstream ofile;
ofile.open("D:\\1\\stu.bin", ios::binary|ios::
out);
if (!
ofile.is_open())
return ;
ofile.write((char*)&s,
sizeof(s));
ofile.close();
//读取二进制文件
ifstream ifile;
ifile.open("D:\\1\\stu.bin", ios::binary | ios::
in);
if (!
ifile)
return;
ifile.read((char*)&s2,
sizeof(s2));
cout << s2.name << endl << s2.age << endl << s2.sex <<
endl;
ifile.close();
system("pause");
}
转载于:https://www.cnblogs.com/ssyfj/p/10780759.html
相关资源:DirectX修复工具V4.0增强版