文件操作函数
在Linux中,甚至是其他设备中,总是需要利用C语言实现操作文件的内容,所谓文件操作,无非就是开关读写几个功能。它们在C语言中,包括最底层的系统调用的版本,以及经过封装之后的标准库版本。
标准库IO接口
标准库IO接口是基于系统调用IO接口实现的,使用的权限没那么大,但是玩法更加多。主要包括了fopen、fwrite、fread、fseek、fclose。
函数内容
1、fopen
函数声明为:
*FILE * fopen(const char * path,const char mode)
这个函数是用于 打开文件,其中path就是需要打开的文件的路径名,如果不带路径的话,就是指当前目录。
这里需要提到的是文件打开操作中的灵魂:mode,也就是文件的打开方式,主要有七种:
打开方式的写法 | 对应的功能 |
---|---|
r | 只读(注:1不能写,写了就会报错,2.如果文件不存在,则报错返回) |
r+ | 可读可写 |
w | 只写(注:1.若文件存在,则清空内容 2.若文件不存在,则创建) |
w+ | 可读可写 |
a | 追加写入(注:1.只写在文件末尾 2.若文件不存在,则创建) |
a+ | 从头读,追加写 (注:若文件不存在,则创建) |
b | 生成原始二进制文件项目 |
返回值:FILE * 文件流指针
其本质为:文件操作句柄,如果失败,返回NULL
2、fwrite
函数声明为:
size_t fwrite(const void * ptr, size_t size, size_t nmemb, FILE * stream);
其中ptr为需要写入文件的数据,size为块大小,nmemb为块个数
这里需要注意的是,此处的写入长度用了两个维度来表示,也就是说:
块
大
小
∗
块
个
数
=
块
总
长
度
块大小 * 块个数 = 块总长度
块大小∗块个数=块总长度
为了防止出现写入不完全的情况,多数情况下认为块大小为1,用块个数来表示长度。
stream为上一步fopen返回的操作句柄,其对应了要操作的文件。
该函数的返回值为:成功返回写入文件的完整块个数,如果未完全写入返回0,失败返回0.
3、fread
函数声明为:
size_t fread(void * ptr, size_t size, size_t nmemb, FILE * stream);
这个函数实现的是,将文件流指针的数据读入ptr空间当中。其中ptr为一块内存空间,用于存放读取到的数据,size表示块大小,nmemb表示块的个数。stream表示fopen返回的操作句柄。
返回值为:成功时返回实际读取到的完整块的个数,如果读到末尾返回0。失败时返回0.所以如果返回的是0时,是存在歧义的。
提一嘴,尽量让fread和fwrite的size定为1.
4、fseek
函数声明为:
int fseek(FILE * stream, long offset, int whence);
这个函数的功能是改变跳转文件读写的位置。其中,stream为fopen返回的文件句柄,offset为偏移量,需要重点强调的是whence,它是相对偏移起始位置。
whence | 位置 |
---|---|
SEEK_SET | 文件起始位置 |
SEEK_CUR | 当前位置 |
SEEK_END | 文件末尾 |
返回值为:成功时返回0,失败时返回-1。
5、fclose
函数声明为:
int fclose(FILE * fp);
这个函数实现的是关闭文件流,释放资源。
这里需要注意的是,fclose和fopen必须是成对存在的,不可以多次fopen对应一次fclose,对于一个循环而言,不能将fopen放入循环内,而将fclose放在循环外。
代码实现
#include<stdio.h>
#include<unistd.h>
#include<fcntl.h>
#include<string.h>
int main()
{
FILE *fp = fopen("./test2.txt"."w+");
if(fp == NULL)
{
perror("error!\n");
return -1;
}
const char* ptr = "this is the input text of ffile.c\n";
int ret = fwrite(ptr,strlen(ptr),1,fp);
if(ret == 0)
{
perror("write error!\n");
return -1;
}
printf("%d\n",ret);
fseek(fp,0,SEEK_SET);
char buf[1024] = {0};
ret = fread(buf,20,50,fp);
if(ret == 0)
{
if(feof(fp))
{
printf("this is the end of file\n");
}
if(ferror(fp))
{
perror("write error!\n");
}
}
printf("%d-%s\n",ret,buf);
fclose(fp);
return 0;
}
得到的结果为: