C语言中文件操作函数汇总

fopen函数  ---   打开一个文件流
函数原型: FILE*  fopen(const char *path, const char *mode);
参数:参数path是需要打开文件的文件名,通常把它叫做文件的路径,
          参数 mode 是打开文件的权限(只读、只写、读写等)。
返回值:打开成功返回指向打开文件的指针,后序可以通过这个指针来访问该文件。 打开失败则返回NULL。

关于第三个参数----文件打开的方式有如下几个选项
r    只读的方式打开
r+    以读写的方式打开,读写都从文件开头开始(并不会清空文件里边原有的内容)
w    只写的方式打开,先清空,再重头写
w+    以读写的文件打开,如果该文件不存在就创建,如果存在,读写从文件开头开始,写之前要先清空文件里边原有的内容。
a    如果文件不存在就创建,用于追加写入
a+  用于追加读/写

举个简单的例子。
#include <stdio.h> 
 int main()
 {
     const char* path = "./test.txt";
    FILE* fp = fopen(path,"w");

     if(fp == NULL)
        printf("opem failed %s\n",path); //文件打开失败时把文件路径打出来,方便我们去该路径查看该文件是否存在

     return 0;
 }
fgetc/fputc函数     --- 读取/写入一个字节
函数原型: int fgetc(FILE *stream);
参数:打开的文件流,即fopen函数的返回值。
返回值:返回所读取的一个字节。 如果读到文件末尾或者读取出错时返回EOF。
说明: 很多人认为这俩函数就是读取一个字符的,然后就用char类型的变量来接收该函数的返回值,但是这样是有问题的。
下边举个例子。
#include <stdio.h>
#include <stdlib.h>
int main()
{
    FILE* fd = fopen("test.txt","r");
    if(NULL == fd)//文件打开失败
    {
        perror("fopen");
        exit(EXIT_FAILURE);
    }
    char ch;//错误示范
    int ch;//正确示范
    while((ch = fgetc(fd))!= EOF)//一直读,知道文件结束
    {
        putchar(ch);
    }
    return 0;
}
当将char类型与int类型做比较时,会有一个整型提升,0xFF将会被提升为0xFFFFFFFF,与EOF的值相等,从而导致文件读取提前结束(而事实上文件并没有读完)。
所以, 一定要使用int类型的变量来接收fgetc函数的返回值

fgets/fputs函数   --- 读取/写入一个字符串
函数原型: char *fgets(char *str, int size, FILE *stream); 
参数:参数str,存储着需要写入的字符串/用于存储读出来的数据
          参数size是读取或者写入的字符创的长度。
          参数stream是打开的文件流,fopen函数的返回值。
返回值:调用成功,将读取的字符串返回,使用fgets函数读取的时候会自动在字符串后边加上一个‘\0’,失败返回NULL。

fread函数   ---从文件流中读取 一段数据
函数原型 size_t fread(void *ptr, size_t size, size_t nmemb, FILE *stream); 
参数:参数ptr用于存放读取的内容。由于读取的内容的类型不固定(可叫做读取记录吧)有可能是一个字符,整型或者结构体,所以是void* 类型的。
          参数size 是读取记录的大小。  
          参数nmemb是读取记录的条数。
          stream是文件流,fopen函数的返回值。
返回值: 返回的是成功读取到的字节数。 有时候我们期望读到很多数据,然后文件流里边又没有那么多数据,该函数会将我们已经读取到的数据的字节数返回。所以,返回值有时候并不等于我们期望读的数据的长度。

fwrite函数    ---向文件里边写数据
函数原型: size_t fwrite(const void *ptr, size_t size, size_t nmemb, FILE *stream);
参数:参数ptr是想要写入到文件流里边去的内容。
          参数size是将要写入元素的大小。
          参数nmemb是将要写入元素的个数。
          参数stream是将要写入的地方。
返回值:返回成功写入数据的字节数。

fprintf函数    ---将格式化的数据写入文件
函数原型: int fprintf(FILE *stream, const char *format, ...);
参数:参数stream是文件指针
          参数format格式化字符串
           后边跟输出列表
返回值:本次写入操作写到文件中的字节数。
使用:fprintf(fp,  "%d",buffer);
fprintf与printf的不同之处在于printf是写入到标准输出(屏幕),而fprintf是将数据写入到指定的文件中去。

fscanf函数  ---格式化的数据读出到变量
函数原型: int fscanf(FILE *stream, const char *format, ...);
参数:参数stream是文件指针
          参数format格式化字符串
           后边跟将要被赋值的变量
返回值:本次成功获取数据的字节数。
fscanf与scanf函数的区别在于scanf是从标准输入(键盘)读取数据,而fscanf是从指定的文件中读取数据。

fseek函数  ---控制文件指针偏移
函数原型:int fseek(FILE *stream, long offset, int whence);
参数:参数stream是文件指针。
          offset是偏移量。
          whence是指偏移方式。有如下三种值可选:
                SEEK_SET 从距文件开头offset 位移量为新的读写位置. 
                SEEK_CUR 以目前的读写位置往后增加offset 个位移量.
                SEEK_END 将读写位置指向文件尾后再增加offset 个位移量. 
说明: 当whence 值为SEEK_CUR 或 SEEK_END 时, 参数offset 允许负值的出现.
            给出两种比较特别的使用方式
              1)、将文件指针移动到开头:fseek(fd, 0, SEEK_SET);
              2)、将文件指针移动到结尾:fseek(fd, 0, SEEK_END);
返回值:调用成功返回0,失败返回-1,errno会存放错误代码。

ftell函数   ---获取当前文件指针的位置
函数原型 :long ftell(FILE *stream);
返回值:文件指针相对于文件开头的偏移量。

rewind函数  ---将文件指针指向文件的开头
函数原型: void rewind(FILE *stream);

feof函数  ---判断文件指针是否指向文件结尾
函数原型:int feof(FILE *stream);
返回值:如果已经到达文件的结尾(已经将文件的最后一个字符都读走了),返回0,否则返回非0数字。
EOF(end of file的简写)是文本文件结束的标志。在文本文件中,数据已字符的ASCⅡ码值的形式存放,普通字符的ASCⅡ码的范围是32到127(十进制),EOF的16进制代码为0XFF(十进制为-1),因此可以用EOF作为文件的结束标识。当把数据以二进制的形式存放到文件中时,就有可能会将数字-1存放到文件中,此时继续根据EOF来判断文件是否结束就会出问题,为了解决这个问题,ASCI C 就提供了feof 函数。

打开一个文件后没有使用flose关闭 会导致文件句柄泄漏或者可以统称为资源泄漏。

使用函数fclose(FILE* stream)关闭打开的文件

r    只读的方式打开
r+    以读写的方式打开,读写都从文件开头开始(并不会清空文件里边原有的内容)
w    只写的方式打开,先清空,再重头写
w+    以读写的文件打开,如果该文件不存在就创建,如果存在,读写从文件开头开始,写之前要先清空文件里边原有的内容。
a    如果文件不存在就创建,用于追加写入
a+  用于追加读/写

猜你喜欢

转载自blog.csdn.net/guaiguaihenguai/article/details/79933747
今日推荐