C++文件操作(自用学习笔记)

数据流的概念

数据流是一组有序的有起点和终点的字节数据序列,包括输入流和输出流。

C++正是通过一种称为流的机制提供了一种更加有效的输入输出方法。

流是一种灵活的面向对象的I/O方法。

根据操作对象的不同可以分为控制台流、文件流、字符串流

控制台流

C++的输入输出操作分别由输入流(istream)和输出流(ostream)两个类提供,但我们平常都是写头文件,iostream正是继承自istream和ostream,这是一种多继承关系。

#include 
using namespace std;

int main()
{
    int a,b;
    cin >> a >> b;
    cout << a + b;
]

在上面这一段简单的代码中,<<(左移操作符)和>>(右移操作符),因为头文件中,ostream类对每一个基本数据类型都有友元函数对左移操作符进行了友元函数的重载。

文件流

文件流的输入输出类在头文件中定义,和控制台流的关系是fstrean继承于iostream。

因为文件设备不像显示器和键盘是标准的默认设备,所有需要定义一个流对象。

ofstream类的默认构造函数原型为:

ofstream::ofstream(const char *filename,int mode = ios::out,int penprot = filebuf::openprot);
参数 含义
filename 要打开的文件名称
mode 打开文件的模式
penprot 打开文件的属性

mode表

模式类型 含义
ios::app 以追加的方式打开文件
ios::ate 打开文件后定位到文件末尾,app就包含此属性
ios::binary 以二进制的方式打开文件
ios:in 以输入的方式打开文件
ios:out 以输出的方式打开文件

penprot表

属性值 含义
0 打开并访问普通文件
1 打开并访问只读文件
2 打开并访问隐藏文件
4 打开并访问系统文件

"|" 或者 "+"可以吧以上多个属性连接起来,例如0|1就是以普通和只读属性打开文件。

字符串流

字符串流是能控制字符串类型对象输入输出的类,C++不仅支持(C++风格)string类的字符串流控制,还支持(C语言风格)char[]类型的字符串流控制。


文件处理

C++文件处理需要头文件,处理时有文本文件和二进制文件两种情况。

C++由一下三个类支持文件输入输出:

ofstream:写操作的文件类

ifstream:读操作的文件类

fstream:同时读写的文件类

所以要在C++中进行文件读写操作,必须包括这两个类。

文件处理基本流程:打开文件->处理文件->关闭文件

文件输入输出

1.打开文件

在对文件进行读或写之前,必须先打开文件。

ofstream和fstream都可以打开文件进行写操作,ifstream打开文件进行读操作。

open函数的标准语法,open是ifstream、ofstream、fstream的对象 一个成员。

void open(const char *filename,ios::openmode mode);
参数 含义
filename 要打开文件的名称
mode 以指定的方式打开文件

可以把两种以上的模式结合使用,例如,想要以写操作并以追加的方式打开文件:

ofstream outf;
outf.open("file.txt",ios::out | ios::app);

想要以读写的方式打开文件:

fstream file;
file.open("file.txt",ios::in | ios::out);

ofstream、ifstream、fstream这三个类的成员open都有一个默认的打开方式:

默认打开方式
ofstream ios::out | ios::trunc
ifstream ios::in
fstream ios::in | ios::out

其中ios:trunc含义是如果要打开的文件已经存在,则将文件长度设为0。即将打开的文件清空后重写。

2.写入与读取文件

写入文件

在C++中,可以使用流插入符(<<)向文件写入信息,类似于使用它向屏幕输出,不过这里的对象不是cout,而是ofstream或fstream。

读取文件

在C++中,可以使用流提取符(>>)向文件读取信息,类似于使用从键盘输入,不过这里的对象不是cin,而是ifstream或fstream。

3.关闭文件

在C++程序终止时,程序会自动关闭刷新所有流,释放所有的内存空间,并关闭所有打开的文件。

但我们在写代码时还是要养成在打开并处理完文件后关闭文件的好习惯。

close()函数的标准语法,close()也是ifstream、ofstream、fstream的对象一个成员。

void close();

长篇大论学了一大堆,终于到了实践环节了。

写一个简单的文件写入程序。

#include 
#include 
using namespace std;

int main()
{
    //1.创建流对象
    ofstream outf;
    //2.打开文件
    outf.open("file.txt",ios::out); //默认是outf.open("file.txt",ios::out | ios::trunc);
    if(!outf.is_open()) //判断文件是否成功打开
    {
        cout << "文件打开失败" << endl;
        return 0;
    }
    //3.写入信息
    outf << "   劝学   " << endl;
    outf << " (唐)颜真卿   " << endl;
    outf << " 三更灯火五更鸡,    " << endl;
    outf << " 正是男儿读书时。   " << endl;
    outf << " 黑发不知勤学早,   " << endl;
    outf << " 白首方悔读书迟。   " << endl;
    //4.关闭文件
    outf.close();
    return 0;
}

既然文件写入成功,那么再试试文件读取。

将刚才写入文件的内容读取出来打印到屏幕输出。

​
#include 
#include 
using namespace std;

int main()
{
    string s;
    //1.创建流对象
    ifstream inf;
    //2.打开文件
    inf.open("file.txt",ios::in);
    if(!inf.is_open())
    {
        cout << "文件打开失败" << endl;
        return 0;
    }
    //3.读取文件
    inf >> s;
    //4.关闭文件
    inf.close();
    cout << s;

    return 0;
}

​

运行这段代码,发现它只读取了第一行就不再读取了。

这是因为在C++中使用ifstream读取文件时会以空格为分隔符,当读取到空格后就不再读取了。

这里有四种方式来读取所有行:

1.可以用get来读取。由于get是用来读取字符的,所以要声明一个char。

#include 
#include 
using namespace std;

int main()
{
    char c;
    //1.创建流对象
    ifstream inf;
    //2.打开文件
    inf.open("file.txt",ios::in);
    if(!inf.is_open())
    {
        cout << "文件打开失败" << endl;
        return 0;
    }
    //3.读取文件
    while(!inf.eof()) // inf.eof()判断是否到达文件末尾。
    {
        inf.get(c);
        cout << c;
    }
    //4.关闭文件
    inf.close();

    return 0;
}

但是使用get一个字符一个字符读取,当数据量十分大时,效率会十分低,所以并不推荐使用这种方式读取。

2.创建一个字符数组buf,将读取到的内容放到buf后输出到屏幕。因为 >> 读取会忽略空格,遇到换行结束,所以打印到屏幕上不会有空格。

#include 
#include 
using namespace std;

int main()
{
    //1.创建流对象
    ifstream inf;
    //2.打开文件
    inf.open("file.txt",ios::in);
    if(!inf.is_open())
    {
        cout << "文件打开失败" << endl;
        return 0;
    }
    //3.读取文件
    char buf[1024] = {0};
    while(inf >> buf)
    {
        cout << buf << endl;
    }
    //4.关闭文件
    inf.close();

    return 0;
}

3.创建一个字符数组buf,用ifstream类的成员函数getline()循环读取每一行,getline()标准语法如下:

getline(char_type* __s, streamsize __n);

第一个参数输入要读入的数组,第二个参数输入数组的大小。

#include 
#include 
using namespace std;

int main()
{
    //1.创建流对象
    ifstream inf;
    //2.打开文件
    inf.open("file.txt",ios::in);
    if(!inf.is_open())
    {
        cout << "文件打开失败" << endl;
        return 0;
    }
    //3.读取文件
    char buf[1024];
    while(inf.getline(buf,sizeof(buf)))
    {
        cout << buf << endl;
    }
    //4.关闭文件
    inf.close();

    return 0;
}

4.创建一个string类,同上循环读取每一行放到s中输出到屏幕。

#include 
#include 
using namespace std;

int main()
{
    //1.创建流对象
    ifstream inf;
    //2.打开文件
    inf.open("file.txt",ios::in);
    if(!inf.is_open())
    {
        cout << "文件打开失败" << endl;
        return 0;
    }
    //3.读取文件
    string s;
    while(getline(inf,s))
    {
        cout << s << endl;
    }
    //4.关闭文件
    inf.close();

    return 0;
}

好了,今天的笔记就写到这了,下次继续!!! -----2025/4/14

你可能感兴趣的:(学习,笔记,c++)