IO
- 流的概念
- fstream的使用
流的概念
什么是流?
1)、流是一种抽象概念,表示了数据的无结构化传递。
2)、C++流是指信息从外部输入设备(如键盘)向计算机内部(如内存)输入和从内存向外部输出设备(显示器)输出的过程。
3)、C++定义了I/O标准类库,用以完成流操作的功能
I/O流
I/O流:输入/输出流
1)、按数据的流向划分:
输入流:数据从键盘流入计算机内部
输出流:数据从内存流向外部输出设备
2)、按处理的单位划分
字节流:读取二进制数据,数据不会经过任何处理
字符流:读取的数据是以字符为单位的。
流类库中常见类
1)、istream:通用输入流类
2)、ostream:通用输出流类
3)、iostream:通用输入/输出流类
4)、ifstream:文件输入流类
5)、ofstream:文件输出流类
6)、fstream:文件输入/输出流类
fstream的使用
fstream的作用
fstream是C++中常用的文件操作类,用于把内存数据写入硬盘文件,或者从硬盘文件把数据读进内存。
C++文件操作
1)、包含头文件,并打开命名空间std
2)、直接使用fstream类来进行对象的实例
fstream myFile;
3)、通过类中成员函数进行文件的各项操作
注意:文件操作时,数据按怎样的顺序写入文件,在读操作时就必须按该顺序读取文件中数据。
fstream类中常见成员函数
open函数
使用open来打开文件,实现类与文件的关联操作。
必须先打开文件才能进行后续的文件内的操作示例:
myFile.open(“路径文件名”,”打开方式”);
路径文件名:可以是绝对路径,也可以是相对路径
打开方式:表示打开文件的模式,不同的模式对应不同的数据操作打开方式可以是一种模式或者多种模式的组合,用| 运算符来组合。
如:
ios::in|ios::binary
表示用打开文件进行数据的读取,且用二进制模式进行数据操作
close函数
使用close来关闭文件,文件重新变为可访问,对象也可以打开其他文件。
必须要使用close关闭文件
示例:
myFile.close();
s_open函数
判断文件是否打开成功,如果打开成功返回1,失败返回0。
示例:
myFile.is_open();
eof函数
判断文件是否到达文件末尾,到达则返回true。
示例:
myFile.eof();
put函数
朝文件写入一个字符。
示例:
myFile.put(‘x’);
char sex = ‘w’;
myFile.put(sex);
get函数
从文件中读取字符。
有3种常用的重载形式
ifstream &get(char &ch);示例:
char x;
myFile.get(x);//从流中读取一个字符,结果保存在x中
int get();
示例:
char x;
x = myFile.get();//从流中读取一个字符,把结果返回出来,赋值给x有3种常用的重载形式
ifstream &get(char *buf,int num,char delim = ‘\n’);
示例:
char testStr[1024];
myFile.get(testStr,1023);//把字符读入testStr指向的数组,直到读入1023
个字符或遇到缺省换行符’\n’时终止,在testStr尾部加0终结符。
myFile.get(testStr,1023,‘A’);//把字符读入testStr指向的数组,当遇到字
符’A’或读取了1023个字符时终止,在testStr尾部加0终结符。
getline函数
从文件中读取一行字符,和get第3种方式类似。
ifstream &getline(char *buf,int num,char delim = ‘\n’);
示例:
char testStr[1024];
myFile.getline(testStr,1023);//把字符读入testStr指向的数组,直到读入
1023个字符或遇到缺省换行符’\n’时终止,在testStr尾部加0终结符。
myFile.getline(testStr,1023,‘A’);//把字符读入testStr指向的数组,当遇
到字符’A’或读取了1023个字符时终止,在testStr尾部加0终结符。get和getline的区别:都可以读多个字符,get会把文件内遇到终结符留在输入
流中,所以需要使用get将终结符扔掉。getline自动把输入流中的终结符取消掉了,
下次可以继续直接读取。读一行字符时,一般使用getline。
seekp或seekg函数
从文件内流指针位置。
示例:
myFile.seekp(5,ios::beg);//从文件开头处向后偏移5个字符。第二个参数有三种:
ios::beg 表示文件开头
ios::end 表示文件结尾
ios::cur 表示文件当前位置
使用重载的”<< ”或者”>> ”
类似于I/O流中的cin和cout,只不过cin和cout是作用在内存,而fstream是作
用在文件。示例:
写入文件:
myFile << “输入输出,明天就秃” << endl;
myFile << x << endl;//x是一个定义好的变量从文件读出:
myFile >> str >> x;//str是一个足够大的字符数组,x是定义好的一个变量
二进制形式的读写文件
myFile.read(const char* s,int num);
第1个参数表示:指向操作对象的首地址
第2个参数表示:操作对象的内存大小
write参照read示例:
写入文件:
int level = 3;
myFile.write((char *)&level,sizeof(level));
从文件读出:
int npcLevel;
myFile.read((char *)&npcLevel,sizeof(npcLevel));
练习代码
#define _crt_secure_no_warnings
#include<iostream>
#include<fstream>
using namespace std;
int main()
{
fstream file;
组合方式, 文件最好存在
eof函数,判断文件指针是否达到文件末尾, 到达返回true
put函数, 向文件写入一个字符
file.open("./file/1.txt", ios::out|ios::in);
if (file.is_open())
{
cout << "打开成功" << endl;
}
else
{
cout << "打开失败" << endl;
}
string str = "yesir";
for (auto e : str)
{
file.put(e);
}
char str[1024] = { 0 };
int i = 0;
while (!file.eof())
{
file.get(str[i++]);
//str[i++] = file. get(); 返回的是强转成10进制的ascii码
}
file.get(str, 1023); //读一行,最多读1023, 最后一个留给\0
cout << str << endl;
file.get(str, 1023, 'c');//读到c结束, 不包含c
cout << str << endl;
file.getline(str, 1023);
cout << str << endl;
file.seekg(0, ios::end);
int size = file.tellg();//获取文件指针的偏移量
cout << size << endl;
file.close();
fstream file1,file2;
file1.open("./file/2.txt", ios::in|ios::out);
file2.open("./file/3.txt", ios::in|ios::out);
char str[1024] = { 0 };
int i = 0;
while (!file1.eof())
{
file1.get(str[i++]);
}
str[i++] = '\n';
while (!file2.eof())
{
file2.get(str[i++]);
}
file1.getline(str, 1023);
file2.getline(str, 1023);
cout << str << endl;
file1.close();
file2.close();
system("pause");
return 0;
}