fopen()函数:打开文件
包含头文件:#include<stdio.h>
FILE * fopen(const char * path,const char * mode);
参数:
path:需要打开的文件路径
mode:文件打开方式
- r 以只读方式打开文件,该文件必须存在。
- r+ 以可读写方式打开文件,该文件必须存在。
- rb+ 读写打开一个二进制文件,允许读数据。
- rt+ 读写打开一个文本文件,允许读和写。
- w 打开只写文件,若文件存在则文件长度清为0,即该文件内容会消失。若文件不存在则建立该文件。
- w+ 打开可读写文件,若文件存在则文件长度清为零,即该文件内容会消失。若文件不存在则建立该文件。
- a 以附加的方式打开只写文件。若文件不存在,则会建立该文件,如果文件存在,写入的数据会被加到文件尾,即文件原先的内容会被保留。(EOF符保留)
- a+ 以附加方式打开可读写的文件。若文件不存在,则会建立该文件,如果文件存在,写入的数据会被加到文件尾后,即文件原先的内容会被保留。 (原来的EOF符不保留)
- wb 只写打开或新建一个二进制文件;只允许写数据。
- wb+ 读写打开或建立一个二进制文件,允许读和写。
- wt+ 读写打开或着建立一个文本文件;允许读写。
- at+ 读写打开一个文本文件,允许读或在文本末追加数据。
- ab+ 读写打开一个二进制文件,允许读或在文件末追加数据。
返回值
如果文件顺利打开,返回指向该流的文件指针。如果文件打开失败则返回NULL,并把错误代码存在errno中。
一般而言,打开文件后会作一些文件读取或写入的动作,若打开文件失败,接下来的读写动作也无法顺利进行,所以一般在fopen()后作错误判断及处理
例子:
#include <stdio.h>
int main(void)
{
FILE *fp = NULL; /* 需要注意 */
fp = fopen(“test.txt”, "r");
if (NULL == fp)
{
return -1; /* 要返回错误代码 */
}
fclose(fp);
fp = NULL; /* 需要指向空,否则会指向原打开文件地址 */
return 0;
}
fclose(): 关闭打开的文件
头文件:#include <stdio.h>
定义函数:int fclose(FILE * stream);
函数说明:fclose()用来关闭先前fopen()打开的文件。此动作会让缓冲区内的数据写入文件中, 并释放系统所提供的文件资源。必要时刷新缓冲区。
对于比较正式的程序,应该检查是否成功关闭文件。如果成功关闭,fclose()函数返回0,否则返回EOF:
if (fclose(fp) != 0)
printf("Error in closing file %s\n",argv[1]);
fread()函数和fwrite()函数:(可以用来实现对数据块的操作)
fread(buffer,size,count,fp);
fwrite(buffer,size,count,fp);
参数:
- buffer:是一个指针,对fread来说,它是读入数据的存放地址。对fwrite来说,是要输出数据的地址。
- size:要读写的字节数;(一个数据块的字节数)
- count:要进行读写多少个size字节的数据项;(要读写的数据块块数)
- fp:文件型指针
例如:
fread(fa,4,5,fp); 其意义是从fp所指的文件中,每次读4个字节(一个实数)送入实数组fa中,连续读5次,即读5个实数到fa中
返回值:
fread返回值为块成功读取块的count数量。
fwrite返回值为块成功写入快的count数量
例子:
#include <stdio.h>
void main()
{
int num;
char name[5];
FILE *fp;
if ((fp = fopen("t.txt", "w")) == NULL)
printf("cannot open file!\n");
scanf("%d %s",&num,name);
fprintf(fp, "%d %s", num, name);
fclose(fp);
if ((fp = fopen("tt.txt", "w")) == NULL)
printf("cannot open file!\n");
fwrite(&num, sizeof(int), 1, fp);
fwrite(name, sizeof(char), 5, fp);
fclose(fp);
}
ftell() 函数:得到流式文件的当前读写位置,其返回值是当前读写位置偏离文件头部的字节数。
long ftell(FILE *fp)
fseek() 函数:把fp的文件读写位置指针移到指定的位置。
int fseek(FILE *fp,long offset,int origin);
origin指的是“起始点”,它有三个常量的值,如下:
起始点对应的数字 代表的文件位置
- SEEK_SET 0 文件开头
- SEEK_CUR 1 文件当前位置
- SEEK_END 2 文件末尾
rewind() 函数:将文件指针重新指向一个流的开头
int rewind(FILE *stream);
例子:一般我们会通过下面的方法来获取文件中字符的个数:
FILE *fs=fopen("C:\1.txt","r");//创建文件流
long length=0;//声明文件长度
fseek(fs,0,SEEK_END);//将文件内部指针放到文件最后面
length=ftell(fs);//读取文件指针的位置,得到文件字符的个数
rewind(fs);//将文件指针重置到文件最前面
例子:
string ReadYamlFile(string& filePath)
{
string strData="";
const char * p8File = (char*)filePath.c_str();
FILE *fp;
fp = fopen(p8File,"r");
if(fp == NULL)
{
cout<<"cannot read file, open error"<<endl;
return "false";
}
fseek(fp,0,SEEK_END);//将文件内部的指针指向文件末尾
long lsize=ftell(fp);//获取文件长度,(得到文件位置指针当前位置相对于文件首的偏移字节数)
rewind(fp);//将文件内部的指针重新指向一个流的开头
//fclose(fp);
char *pData= new char[lsize+1];
memset(pData,0,lsize+1);//将内存空间都赋值为‘\0’
int result=fread(pData,1,lsize,fp);//将pfile中内容读入pread指向内存中
fclose(fp);
strData = std::string(pData);
if(pData)
{
delete[] pData;
pData = NULL;
}
return strData;
}