IO

  1. 流的概念
  2. 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
表示用打开文件进行数据的读取,且用二进制模式进行数据操作

c文件使用iostream c语言里iostream_c文件使用iostream

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;
}