C++中文件操作与文件流

简介: 🐰文件操作与文件流🏡文件流类和文件流对象🏡文件的打开与关闭🌸1.文件的打开🌸2.文件的关闭🏡对文本文件的操作🏡对二进制文件的操作🌸1.用成员函数write和read操作二进制文件🌸2.随机访问二进制文件

🚀🚀🚀大家觉不错的话,就恳求大家点点关注,点点小爱心,指点指点🚀🚀🚀

目录

🐰文件操作与文件流

🏡文件流类和文件流对象

🏡文件的打开与关闭

🌸1.文件的打开

🌸2.文件的关闭

🏡对文本文件的操作

🏡对二进制文件的操作

🌸1.用成员函数write和read操作二进制文件

🌸2.随机访问二进制文件


🐰文件操作与文件流

🏡文件流类和文件流对象

我们可以知道在标准设备为对象的输入输出中,必须定义流对象,如cin、cout就是流对象,C++是通过流对象进行输入输出的。同理,如果磁盘文件为对象进行输入输出,也必须先定义一个文件流类的对象,通过文件流对象将数据从内存输出到磁盘文件或者从磁盘文件将数据输入到内存

由于cin和cout已经在iostream.h(iostream)中定义了,所以我们不需要定义就可以使用。但是文件流对象没有事先定义,必须由我们自己定义

例如:

1. ofstream outfile;  //输出文件流对象
2. fstream outfile;
3. ifstream infile;   //输入文件流对象
4. fstream infile;

🏡文件的打开与关闭

磁盘文件的打开与关闭使用fstream类中定义的成员函数open和close

🌸1.文件的打开

要对磁盘文件进行读写操作,首先必须打开文件打开文件就是将文件流对象与具体的磁盘文件建立关系,并指定使用方式。

(1)先定义一个fstream的对象,再调用该对象的成员函数open打开指定的文件。

例如

1. fstream outfile;//定义了fstream类(输入输出流)对象
2. outfile.open("test.txt",ios::out);//使文件流对象outfile与test.txt文件建立关系

open函数提供了两个参数:第一个参数是要被打开的文件名,使用文件名时可以包括路径,如"c:\\new\\f1.dat",第二个参数说明文件的访问方式。访问方式多种方式。

67FA3081-C3D8-47F5-BEAC-46F2611E933C.jpeg

(2)在定义流对象时同时指定参数

在声明文件流类时定义了带参数的构造函数,其中包括了打开磁盘文件的功能。因此,可以在定义文件流对象时指定参数,调用文件流类的此构造函数来实现打开文件的功能。

例如

fstream outfile("test.txt",ios::out);

作用与open函数相同,参数含义相同

🌸2.文件的关闭

当结束一个磁盘文件的读写操作后,应该关闭文件。关闭文件用成员函数close。

例如:outfile.close

1. #include<iostream>
2. #include<fstream>
3. using namespace std;
4. int main()
5. {
6.     int n;
7.     double d;
8.     fstream out("test.txt",ios::out);
9.     out<<10<<endl;
10.     out<<10.1<<endl;
11.     out.close();
12.     fstream in("test.txt",ios::in);
13.     in>>n;
14.     in>>d;
15.     cout<<"n="<<n<<" "<<"d="<<d<<endl;
16.     return 0;
17. }
18. 结果:
19. n=10 d=10.1

🏡对文本文件的操作

对文本文件的读写操作可以用流插入运算符"<<"和流提取运算符">>"输入输出标准类型数据。"<<"和">>"运算符已经在iostream中被重载,能够用于ostream和istream类对象的标准类型数据的输入输出。ifstream和ofstream分别是istream和ostream的派生类,它们从istream和ostraem类继承了公用的重载函数,所以在对磁盘文件的操作中,可以使用文件流对象和">>"以及"<<"实现磁盘文件的读写

对文本文件的读写操作也可以用文件流的put、get、getline等成员函数进行字符的输入输出。

例如:

1. #include<iostream>
2. #include<fstream>
3. using namespace std;
4. int main()
5. {
6.     char s[20];
7.     cout<<"请输入数据"<<endl;
8.     cin.getline(s,100,'\n');
9.     fstream op("test.txt",ios::out);//定义文件流对象op,以写入的方式打开磁盘文件"test.txt"
10.     if(!op)//如果打开失败,op返回0
11.     {
12.         cerr<<("打开文件失败")<<endl;
13.         exit(1);
14.     }
15.     op<<s;//向磁盘文件"test.txt"写入数据
16.     op.close();//关闭文件
17.     fstream op1;//定义了文件流对象op1
18.     op1.open("test.txt",ios::in);//以读出的方式打开磁盘文件"test.txt"
19.     if(!op1)//如果打开失败,op返回0
20.     {
21.         cerr<<("打开文件失败")<<endl;
22.         exit(1);
23.     }
24.     char ptr[20];
25.     op1.get(ptr,20,'\n');//将文件"test.txt"读出到字符数组ptr中
26.     cout<<"从文件得到的数据为"<<endl;
27.     cout<<ptr<<endl;//将ptr的数据输出到显示器上
28.     op1.close();//关闭文件
29.     return 0;
30. }
31. 结果:
32. 请输入数据
33. hello world
34. 从文件得到的数据为
35. hello world

🏡对二进制文件的操作

二进制文件中的信息不是字符数据,而是字节中的二进制形式的信息,因此又称为字节文件。对二进制文件的操作同样是使用时要先打开文件,用完要关闭文件。在打开时要用ios::binary指定为以二进制形式传递和存储。二进制文件除了作为输入文件或输出文件外,还可以既能输入又能输出的文件,这是和文本文件不同的地方

🌸1.用成员函数write和read操作二进制文件

向二进制文件中写入信息时,使用write函数,从二进制文件中读出信息,使用read函数。原型如下:

1. istream& read(char* buff,int length);
2. ostraem& write(const char* buff,int length);

buff:指向内存中一段存储空间

int length:读写的字节数

例如:

out.write(p1,30);//out是输出文件流对象,write函数将字符指p1所给的地址开始的20字节内容不加转换地写到磁盘文件中

in,read(p2,30);//in是输入文件流对象,read函数从in关联的磁盘文件中读取30个字节(或遇到EOF结束),存放在字符指针p2所指向的一段内存空间

例如:

1. #include<iostream>
2. #include<fstream>
3. using namespace std;
4. class Student//定义了学生类
5. {
6. private:
7.     long No;//学号(这里是整形的,根据需要也可以改成string型的)
8.     char* Name;//名字
9.     int Score;//成绩
10. public:
11.     Student(long stu_no=0,char* stu_name=NULL,int stu_score=0)//构造函数给数据成员赋值
12.     {
13.         No=stu_no;
14.         Name=stu_name;
15.         Score=stu_score;
16.     }
17.     //由于数据成员都是私有的,所以需要成员函数来实现私有数据在类外访问
18.     long GetNo()//返回学号
19.     {
20.         return No;
21.     }
22.     char* GetName()//返回名字
23.     {
24.         return Name;
25.     }
26.     int GetScore()//返回分数
27.     {
28.         return Score;
29.     }
30.     void Show()//显示一位学生的信息(学号、名字、成绩)
31.     {
32.         cout<<No<<" "<<Name<<" "<<Score<<endl;
33.     }
34. };
35. int main()
36. {
37.     Student stu[3]={{20090700,"liming",70},{20090702,"Hujun",80},{20090703,"Wangtian",90}};//定义了三个学生对象
38.     int k,pos;
39.     fstream out,in;//定义了输出和输入文件流的对象
40.     out.open("test.txt",ios::out|ios::binary);//打开文件的方式是只写和二进制形式
41.     if(!out)
42.     {
43.         cerr<<"File open error!"<<endl;
44.         exit(-1);
45.     }
46.     for(int i=0;i<3;i++)//将三个学生信息写入文件test.txt
47.     {
48.         out.write((char*)&stu[i],sizeof(Student));
49.     }
50.     out.close();//关闭文件
51.     cout<<"test.txt:"<<endl;
52.     in.open("test.txt",ios::in|ios::binary);//打开文件的方式是只读和二进制形式
53.     Student s1[3];
54.     for(int i=0;i<3;i++)//将test.txt文件的内容读到对象数组s1中,再将s1数组的内容显示出来(s1的内容是三个学生的信息)
55.     {
56.         in.read((char*)&s1[i],sizeof(Student));
57.         cout<<s1[i].GetNo()<<" "<<s1[i].GetName()<<" "<<s1[i].GetScore()<<endl;
58.     }
59.     in.close();//关闭文件
60.     in.open("test.txt",ios::in|ios::binary);//打开文件的方式是只读和二进制形式
61.     cout<<"please input the number of record:";
62.     cin>>k;//k是第几个学生
63.     pos=(k-1)*sizeof(Student);//第k个学生的偏移量
64.     in.seekg(pos);//用成员函数seekg找到第k个学生的位置
65.     Student s2;
66.     in.read((char*)&s2,sizeof(Student));//将第k个学生的信息读到对象s2中
67.     cout<<s2.GetNo()<<" "<<s2.GetName()<<" "<<s2.GetScore()<<endl;//显示第k个学生的信息
68.     in.close();//关闭文件
69.     cout<<"Delete the Second record!"<<endl;//删除第二个学生的信息
70.     out.open("test.txt",ios::out|ios::binary);//打开文件的方式是只写和二进制形式
71.     for(int i=0;i<3;i++)//将三个学生中除第二个学生的信息其他人的信息写到test.txt中(这里将覆盖原来test.txt的内容)
72.     {
73.         if(i!=1)
74.         {
75.             out.write((char*)&stu[i], sizeof(Student));
76.         }
77.     }
78.     out.close();//关闭文件
79.     in.open("test.txt",ios::in|ios::binary);//打开文件的方式是只读和二进制形式
80.     Student s3[2];//对象数组s3
81.     for(int i=0;i<2;i++)//显示删除第二个学生后的其他学生的信息
82.     {
83.         in.read((char*)&s3[i],sizeof(Student));
84.         cout<<s3[i].GetNo()<<" "<<s3[i].GetName()<<" "<<s3[i].GetScore()<<endl;
85.     }
86.     in.close();//关闭文件
87.     return 0;
88. }
89. 结果:
90. test.txt:
91. 20090700 liming 70
92. 20090702 Hujun 80
93. 20090703 Wangtian 90

🌸2.随机访问二进制文件

前面的例子都是顺序方式访问文件。但是对于二进制文件,还可以对它进行随机访问。在对一个二进制文件进行读写操作时,系统会为该文件设置一个读写指针,用于指示当前应进行读写的位置。在输入时每读入一个字节,指针就向移动一个字节。在输出时每向文件输出一个字节,指针就向后移动一个字节,随着输出文件中字节的不断增加,指针不断后移。文件流提供文件指针相关的成员函数。

文件指针有关的成员函数

66095B3A-0AF5-4C86-88DD-9284498FD90C.jpeg

 

其中,参数<文件中的位置>、<偏移量>都是long型量,并以字节为单位。<参照位置>可以被设置为以下3个值之一,它们是在ios类中定义的枚举常量:

1)ios::cur表示相对于文件的当前读指针位置

(2)ios::beg表示相对于文件的开始位置

(3)ios::end表示相对于文件的结尾位置

例如:

1. #include<iostream>
2. #include<fstream>
3. using namespace std;
4. class Student//定义了学生类
5. {
6. private:
7.     long No;//学号(这里是整形的,根据需要也可以改成string型的)
8.     char* Name;//名字
9.     int Score;//成绩
10. public:
11.     Student(long stu_no=0,char* stu_name=NULL,int stu_score=0)//构造函数给数据成员赋值
12.     {
13.         No=stu_no;
14.         Name=stu_name;
15.         Score=stu_score;
16.     }
17.     //由于数据成员都是私有的,所以需要成员函数来实现私有数据在类外访问
18.     long GetNo()//返回学号
19.     {
20.         return No;
21.     }
22.     char* GetName()//返回名字
23.     {
24.         return Name;
25.     }
26.     int GetScore()//返回分数
27.     {
28.         return Score;
29.     }
30.     void Show()//显示一位学生的信息(学号、名字、成绩)
31.     {
32.         cout<<No<<" "<<Name<<" "<<Score<<endl;
33.     }
34. };
35. int main()
36. {
37.     Student stu[3]={{20090700,"liming",70},{20090702,"Hujun",80},{20090703,"Wangtian",90}};//定义了三个学生对象
38.     int k,pos;
39.     fstream out,in;//定义了输出和输入文件流的对象
40.     out.open("test.txt",ios::out|ios::binary);//打开文件的方式是只写和二进制形式
41.     if(!out)
42.     {
43.         cerr<<"File open error!"<<endl;
44.         exit(-1);
45.     }
46.     for(int i=0;i<3;i++)//将三个学生信息写入文件test.txt
47.     {
48.         out.write((char*)&stu[i],sizeof(Student));
49.     }
50.     out.close();//关闭文件
51.     cout<<"test.txt:"<<endl;
52.     in.open("test.txt",ios::in|ios::binary);//打开文件的方式是只读和二进制形式
53.     Student s1[3];
54.     for(int i=0;i<3;i++)//将test.txt文件的内容读到对象数组s1中,再将s1数组的内容显示出来(s1的内容是三个学生的信息)
55.     {
56.         in.read((char*)&s1[i],sizeof(Student));
57.         cout<<s1[i].GetNo()<<" "<<s1[i].GetName()<<" "<<s1[i].GetScore()<<endl;
58.     }
59.     in.close();//关闭文件
60.     in.open("test.txt",ios::in|ios::binary);//打开文件的方式是只读和二进制形式
61.     cout<<"please input the number of record:";
62.     cin>>k;//k是第几个学生
63.     pos=(k-1)*sizeof(Student);//第k个学生的偏移量
64.     in.seekg(pos);//用成员函数seekg找到第k个学生的位置
65.     Student s2;
66.     in.read((char*)&s2,sizeof(Student));//将第k个学生的信息读到对象s2中
67.     cout<<s2.GetNo()<<" "<<s2.GetName()<<" "<<s2.GetScore()<<endl;//显示第k个学生的信息
68.     in.close();//关闭文件
69.     cout<<"Delete the Second record!"<<endl;//删除第二个学生的信息
70.     out.open("test.txt",ios::out|ios::binary);//打开文件的方式是只写和二进制形式
71.     for(int i=0;i<3;i++)//将三个学生中除第二个学生的信息其他人的信息写到test.txt中(这里将覆盖原来test.txt的内容)
72.     {
73.         if(i!=1)
74.         {
75.             out.write((char*)&stu[i], sizeof(Student));
76.         }
77.     }
78.     out.close();//关闭文件
79.     in.open("test.txt",ios::in|ios::binary);//打开文件的方式是只读和二进制形式
80.     Student s3[2];//对象数组s3
81.     for(int i=0;i<2;i++)//显示删除第二个学生后的其他学生的信息
82.     {
83.         in.read((char*)&s3[i],sizeof(Student));
84.         cout<<s3[i].GetNo()<<" "<<s3[i].GetName()<<" "<<s3[i].GetScore()<<endl;
85.     }
86.     in.close();//关闭文件
87.     return 0;
88. }
89. 结果:
90. test.txt:
91. 20090700 liming 70
92. 20090702 Hujun 80
93. 20090703 Wangtian 90

🌸🌸🌸如果大家还有不懂或者建议都可以发在评论区,我们共同探讨,共同学习,共同进步。谢谢大家! 🌸🌸🌸  

相关文章
|
7月前
|
安全 算法 程序员
【C/C++ 文件操作】深入理解C语言中的文件锁定机制
【C/C++ 文件操作】深入理解C语言中的文件锁定机制
224 0
|
7月前
|
存储 C++ iOS开发
C++文件操作
C++文件操作
|
7月前
|
移动开发 Linux 程序员
c++文件操作,超详细
c++文件操作,超详细
115 0
|
7月前
|
编译器 API 数据安全/隐私保护
深入对比:Qt 的 QFile/QFileInfo 和与 C++17 Filesystem 和标准文件流 的细节剖析
深入对比:Qt 的 QFile/QFileInfo 和与 C++17 Filesystem 和标准文件流 的细节剖析
633 3
|
7月前
|
C++ iOS开发
C++ 文件操作的技术性文章
C++ 文件操作的技术性文章
40 0
|
6月前
|
存储 C++
C++文件操作
C++文件操作
|
7月前
|
存储 C语言 数据安全/隐私保护
C++中的文件操作技术详解
C++中的文件操作技术详解
|
7月前
|
C++
C++程序对数据文件的操作与文件流
C++程序对数据文件的操作与文件流
60 0
|
7月前
|
C++
C++语言学习文件操作应用案例
C++文件操作示例:创建`ofstream`对象写入&quot;Hello, World!&quot;到`output.txt`,刷新缓冲区,然后使用`ifstream`读取并打印文件内容。如果文件打开失败,程序将显示错误信息并返回1。
42 3