C++之中关于文件的一系列基本的操作

随着学习深入,以及需求的增加,需要对文件进行相关的一系列的操作,现将文件的一些常见的必要的操作介绍如下:

一、文件的头文件

#include <fstream>//这个是包含了所有的文件的操作的头文件  包含了读和写

#include <ifstream>//这是读文件的头文件,如需要只读文件时就只写入这个就可

#include <ofsteam>//这是一个写文件的头文件,如需要只写文件就值写入这个即可
  

为了保险起见,本人建议直接写第一个,确保万无一失

二、文件的读入和写出的方式

文件的打开方式
打开方式解释说明
ios::in为读文件而打开文件
ios::out为写文件而打开文件
ios::ate初始位置文件尾(将文件指针放在文件尾)
ios::app追加的方式写出到文件(在文件存在的情况下接着原有的文件后面接着写)
ios::trunc清楚已经存在的文件,然后再创建(保证每次的文件都是同名且内容是全新的)
ios::binary以二进制的方式读写文件

注意:这几种方式可以一起共用,但是ios::app和ios::trunc两者不能在同一个文件中的同一处使用,eg:ofs.open("123.txt",ios::app  |   ios::trunc);   这个语句是不合法的;多个方式连用的格式为:方式 1  |  方式 2,中间用 “|” 连接。

ofstream ofs;//该语句表示创建一个文件流  下面会介绍
ofs.open("123.txt",ios::in|ios::out|ios::app); //这种写法是对的,表示123.txt这个文件既可以读也可以写,并且写入的时候是以追加的方式进型写入的。

ofs.open("123.txt",ios::in | ios::app | ios::trunc)//这种写法是不正确的,app 和  trunc 不可以连用,语法不合法

三、读写文件的步骤

  1. 包含头文件(见上面的一)
  2. 创建文件流
    //创建文件流的方式有三种
    ifstream fp1;//这表示只写入的文件流   其中fp1表示自己定义的文件名称
    
    ofstream fp2;//这表示只读出的文件流   其中fp2表示自己定义的文件名称
    
    fstream fp2;//这表示只写入和读出的文件流   其中fp2表示自己定义的文件名称
    
  3. 打开文件
fp1.open("123.txt",ios::in);//前面的fp1是和上一步中的一一对应的,然后“123.txt”表示你即将写入的文件名,自定义,后面跟着的是打开方式参照二中的用法合理使用

 注意:可以加一个打开是否成功的判断:fp1.is_open()是一个内置的函数,用于判断文件是否打开成功的,成功返回1,失败返回0。

if(fp1.is_open())
{
   cout<<"you have opened this file successfully !!!"<<endl;//成功打开文件
}
else
{
   cout<<"file open error !!!"<<endl;//文件打开失败
}

4.关闭文件

fp1.lose();//括号里面没有任何东西

5.读或者写文件

在读写文件里的内容的时候并没有什么特别之处,依旧是注意数据类型是否和原来的保持一致,然后,就跟cout 和 cin 的输出与输入一样的没有什么区别。

fp1<<a<<endl;//假设a 是前面定义并且有值的一个变量,这个语句就表示已将将 a 写入到文件“123.txt”之中了

fp2>>b;//这就表示把文件fp2中的一个数据读入并且将它赋值给了 b ,就是需要注意 b 的数据类型要和文件中的数据类型保持一致

 6.从文件的任意位置开始读写:

在前面介绍的关于读取文件的操作都只能从文件头开始读取,不能读取任意位置,故此介绍一下下面几个常用的语句。

在读取文件之前最好规定一下文件位置指针的位置,避免每次都是从头开始读取,见如下语句:

/*
在C++中文件位置指针函数有两个:seekphe seekg
seekp:
fp1.seekp(偏移字节数,起始位置);//这里的偏移字节数表示从自己定义的“起始位置”开始向前或者向后的第几个字节数开始读取,或者从原文件向前或者向后的第几个字节数开始写入,起始位置类型分为三种一个是当前位置(ios::cur)、一个是文件头(ios:beg)、还有一个是文件尾(ios::end),其中文件头和当前位置是向后读取或者写入,只有文件尾是向前读取或者写入,假如没有起始位置说明默认为是文件头开始。
发票。
seekg(偏移字节数,起始位置);//用法和各参量含量与seekp一样的。
*/

五、关于读取和写入文件的部分特殊说明 

下面用到的文件的定义和打开方式不同于上面的,跟C语言上面的文件的定义和打开方式等是保持一致的,简要说明一下:

文件定义:
FILE *fp;
fp=fopen(“文件地址\\文件名”,“读写方式”);//这表示打开一个文件,关于文件是否成功打开与上面的判断一样不加赘述
fclose(fp);//这表示关闭fp文件
代码意义
r只读 打开 文本文件
w只写 打开/建立 文本文件
at追加 打开 文本文件 文件末尾写数据
rb只读 打开 二进制文件
wb只写 打开/建立 二进制文件
ab追加 打开 二进制文件 文件末尾写数据
r+读写 打开 文本文件 允许读写
wt+读写 打开/建立 文本文件 允许读写
at+读写 打开 文本文件 允许读,或在文件末追加数
rb+读写 打开 二进制文件 允许读和写
wb+读写 打开/建立 二进制文件 允许读和写

1、读取文件

在前面介绍的关于读取文件的操作都C++中特有的,在C语言中适不适用本人并未考究,欢迎各位去尝试,接下来介绍一种C和C++均适用的。

在读取文件之前最好规定一下文件位置指针的位置,避免每次都是从头开始读取,见如下语句:

fseek (file name,偏移字节数,起始位置);//这里的偏移字节数表示从自己定义的“起始位置”开始向前或者向后的第几个字节数开始读取,或者从原文件向前或者向后的第几个字节数开始写入,
//起始位置的类型分为三种,1表示从当前位置即起始位置字节数开始往后读取,0表示从头开始读,
//2表示从文件尾开始读取,当然也可以用SEEK_CUR\SEEK_SET\SEEK_END来一一对应表示相关意义操作。)
fseeko64(file name,起始位置字节数,开始类型);//这个语句用于文件特别大的时候,假如不确定文件有多大直接用这个是没问题的,大小文件都适合

读取文件的函数:

/*
第一种方式:
fwrite(指针名,读取的长度,读取的个数,文件名);//指针名就是指把信息从文件中读取出来暂时存放的位置,读取的长度表示你读去的信息的单位长度,比如整型数据就是4,字符型就是1,读取个数表示你要读取的信息的个数,文件名表示从哪个文件中去读取你所需要的信息
eg:
*/
FILE *fp;
int *A;
fp=fopen("123.txt","w+");//这里我为了简化写法使用的是C语言上的一些关于文件的操作函数,
//C语言上的操作对于C++也是适用的
fseek(fp,0,0);//表示从文件123.txt中从头开始读
fread(A,4,10,fp);//这里的数组A相当于一个临时存放的空间,类似于一个中转站,表示从123.txt中读取十个整型数据

/*
第二种方式:
fscanf(文件名,格式,&变量名);//表示从文件中读取一个或者多个数据存放到不同的变量之中,格式是跟C语言之中的scanf函数的格式一样的,变量名前面加上地址符
fscanf(fp,"%d,%c",&a,&b);//表示从文件fp中先读取一个整数给变量a,在读取一个字符给变量b;


备注:在用到上述函数时在头文件上加上“#include<stdio.h>”和“#include<stdlib.h>“
*/

写入到文件fp之中的的几个常用函数:

/*
第一种:
fwrite(A,n,m,fp);//各个参量的意义参照上面的fread函数,这个表示将数组A中的m个长度为n的数据写入到文件fp之中
eg:
int A[5]={1,2,3,4,5};
fwrite(A,sizeof(int),4,fp);//表示将数组A中的前四个整形数据写入到文件fp之中,大家有注意到我这里有两个特殊的地方,第一个是用到了函数sizeof,这个函数表示计算某一个变量或者数组或者数据类型的大小的,以字节为单位,第二个是我这里并没有让数组A中的5个数都写入到文件之中,这就表明我们可以人为控制一个数组中元素的写出个数



第二种:
fprintf(fp,"%d,%c",a,b);//函数之中的各个参量依旧参照printf函数的变量的意义,这个表明将一个整数和一个字符写入到文件fp之中

备注:以上观点是博主自己学习之后的理解,若有不对之处欢迎在下方评论指正。 

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

仔仔军

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值