C++系列:输入输出和模板(六)
输入输出和模板
输入输出流相关的类
- ios 基类
- istream 用于输入的流类,cin是该类对象
- ifstream 从文件读取数据操作
- iostream 既能输入又能输出的类
- fstream 既能读文件,又能写文件的类
- ostream 用于输出的流类,cout是该类对象
- ofstream 向文件写入数据的类
- iostream
- istream 用于输入的流类,cin是该类对象
标准流对象
-
输入流对象:cin 与标准输入设备相连
-
输出流对象:cout 与标准输出设备相连
-
cerr 与标准错误输出设备相连
-
clog 与标准错误输出设备相连
//缺省情况下,相同
cerr <<"Hello,world"<<endl;
clog <<"Hello,world"<<endl;
cout <<"Hello,world"<<endl; -
cin对应于标准输入流,用于从键盘读取数据,也可以被重定向为从文件中读取数据。
-
cout对应于标准输出流,用于向屏幕输出数据,也可以被重定向为向文件写入数据。
-
cerr对应于标准错误i输出流,用于向屏幕输出错误信息
-
clog对应于标准错误输出流,用于向屏幕输出错误信息
-
cerr和clog的区别在于cerr不使用缓冲区,直接向显示器输出信息;而输出到clog中的信息先会被存放在缓冲区,缓冲区满或者刷新时才输出到屏幕
输出重定向
|
输入重定向
|
判断输入流结束
//判断数据是否读完 |
-
如果是从文件输入数据,
freopen("some.txt","r",stdin);//到文件尾部,输入流就算结束
-
如果从键盘输入,在单独一行输入Ctrl+Z代表输入流结束
istream类的成员函数
istream & getline(char * buf,int buffSize); |
流操纵算子
- 整数流的基数:流操纵算子dec、oct、hex、setbase
- 浮点数的精度(precision,setprecision)
- 设置域宽(setw,width)
- 用户自定义的流操纵算子
//整数流的基数: 流操纵算子 dec ,oct ,hex |
控制浮点数精度的流操纵算子
-
precision是成员函数
//调用方式为: cout.precision
-
setprecison 是流操纵算子
//调用方式为: cout << setprecision(5); //可以连续输出,连续起作用
-
功能都相同
- 制度输出浮点数的有效位数 非定点方式输出时
- 指定输出浮点数的小数点后端有效位数(顶点方式输出时)
- 定点方式:小数点必须出现在个位数后面
|
|
设置域宽的流操纵算子
- setw 成员函数
- width 流操纵算子
- 两个功能相同,调用方式不同
//是一次性的设置 |
|
//综合例子 |
用户自定义流操纵算子
|
文件和流
|
-
创建文件
//也可以先创建ofstream对象,再用open函数打开
ofstream fout;
fout.open("test.out",ios::out|ios::binary); -
判断打开是否成功
if(!fout)
{
cout<<"File open error!" << endl;
} -
文件名可以给出绝对路径,也可以给相对路径。没有交代路径信息,就是在当前文件夹下找文件
文件名的绝对路径喝相对路径
-
绝对路径
c:\\tmp\\mydir\\some.txt
-
相对路径
//当前盘符的根目录下的tmp\dir\some.txt
\\tmp\\mydir\\some.txt//当前文件夹的tmp子文件夹里面的...
tmp\\mydir\\some.txt//当前文件夹的父文件夹下面的tmp子文件夹里面的...
..\\tmp\\mydir\\some.txt//当前文件夹的父文件夹的父文件夹下面的tmp子文件夹里面的...
..\\..\\tmp\\mydir\\some.txt
文件的读写指针
- 对于输入文件,有读指针
- 对于输出文件,有写指针
- 对于输入输出文件,有一个读写指针
- 标识文件操作的当前位置,该指针在哪里,读写操作就在哪里进行
|
字符文件读写
- 因为文件流也是流,所有流的成员函数和流操作算子也同样适用于文件流
- 写一个程序,将文件in.txt里面的整数排序,输出到out.txt
|
二进制文件读写
-
二进制读文件
- ifstream 和 fstream的成员函数:
istream& read (char* s,long n);
//将文件读指针指向的地方s的n个字节内容
//读入到内存地址s,然后将文件读指针向后移动n字节
//以ios::in 方式打开文件时,文件读指针开始指向文件开头 -
二进制写文件
-
ofstream 和fstream的成员函数:
istream& write(const char*s , long n);
//将内存地址s处的n个字节内容
//写入到文件中写指针指向的位置,然后将文件写指针向后移动n字节
//以ios::out 方式打开文件时,文件写指针开始指向文件开头
//以ios::app 方式打开文件时,文件写指针开始指向文件尾部
-
//文件中写入一个整数 |
-
从键盘输入几个学生的姓名的成绩,并以二进制文件形式保存
//二进制文件
using namespace std;
struct Student
{
char name[20];
int score;
};
int main()
{
Student s;
ofstream OutFile("students.dat", ios::out | ios::binary);
while (cin>>s.name>>s.score)
{
OutFile.write((char *)&s, sizeof(s));
}
OutFile.close();
return 0;
} -
读文件
|
- 修改文件
|
- 复制文件
/* |
二进制文件和文本文件的区别
-
Linux 和 Unix下的换行符号:‘\n’ (ASCII码 : 0x0a)
-
Windows下的换行符号:‘\r\n’ (ASCII码 : 0x0d0a) endl 就是‘\n’
-
Mac OS下的换行符号:‘\r’ (ASCII码 : 0x0d)
-
不注意就会导致Linux和 Mac OS文本文件在Windows 记事本打开时不换行
-
Unix/Linux 下打开文件,用不用ios::binary 没区别
-
Windows 下打开文件,如果不用ios::binary,则:
- 读取文件时,所有的‘\r\n’会被当做一个字符‘\n’处理,即少读了一个字符‘\r’
- 写入文件时,写入单独的’\n’时,系统自动在前面加一个’\r‘,即多写了一个’\r‘
函数模板
- 能否只写一个Swap
- 代码重用
- 容易的生成相像的函数
- 模板生成函数 是模板函数的实例化
类模板
类模板与友元
类模板与静态成员变量的关系
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 Q's blog!
评论