标准库IO接口
fopen
函数原型:FILE *fopen(char *filename, char *mode)
参数内容(文件名称,打开方式)
功能:打开一个文件
打开方式常用的有7种
r
以只读的方式打开文件
r+
以读写的方式打开文件,若文件不存在则会报错
w
以只写的方式打开文件
w+
以读写的方式打开文件,若文件不存在则创建,文件存在就清空原有内容
a
以追加写的方式打开文件,文件不存在会创建新的文件
a+
以追加读写的方式打开,文件不存在会创建新的文件
b
以二进制操作方式打开文件;默认情况下不指定b,则认为文件是文本操作,加上b就认为是以二进制操作文件;区别在于有时候一个特殊的字符会占用两个字节的内存,如果以文本操作方式读取文件,不一定能将所有数据正确读出。所以我们平时最好是加上b
该函数的返回值:返回一个FILE*文件流指针为文件的操作句柄;失败返回NULL
fread 和 fwrite
fread函数原型:size_t fread(char *buf, size_t block_size, size_t block_count, FILE* fp)
参数内容(缓冲区,块大小,块个数,文件流指针)
功能:读取一个文件内容
fwrite函数原型:size_t fwrite(char *data, size_t block_size, size_t block_count, FILE* fp)
参数内容(数据首地址,块大小,块个数,文件流指针)
功能:将数据写到文件中
这两个函数的返回值:都是返回实际操作的块个数,例如要读取一个文件块大小size=10,块个数count=,1;但是文件大小只有8个字节,则会返回0,因为第二个块没读完。如果fread读到了文件末尾也会返回0。所以这两个函数推荐块大小为1,块个数为想要操作的数据长度。这样子就不会出现读到数据依然返回0的情况
对文件数据进行字符串操作时要注意文件数据的\0
fseek
函数原型:int fseek(FILE *fp, long offset, int whence)
参数内容(文件流指针,偏移大小,偏移起始位置)
偏移大小实参:负数-向前偏移;正数-向后偏移;0-不偏移
偏移起始位置:SEEK_SET
从文件起始位置偏移;SEEK_CUR
从当前读写位置开始偏移;SEEK_END
从文件末尾偏移
功能:将文件流指针从whence位置偏移offset个字节,跳转文件读写的位置,文件没有数据也可以跳转,前面置空
fclose
函数原型:int fclose(FILE *FP)
参数内容(文件流指针)
功能:关闭文件流指针,释放资源
以上函数用法代码示例:
int main()
{
FILE *fp = NULL;
//以读写的方式打开当前路径下的test.txt文件
fp = fopen("./test.txt", "r+");
if (fp == NULL)
{
perror("fopen error");
return -1;
}
//将fp文件流指针偏移置文件末尾
fseek(fp, 0, SEEK_END);
char *ptr = "WhiteShirtI very cool\n";
//将ptr的内容写到fp文件流指针所指位置
int ret = fwrite(ptr, strlen(ptr), 1, fp);
if (ret == 0)
{
perror("fwite error");
return -1;
}
printf("write ret:%d\n", ret);
//将fp文件流指针偏移置文件的起始位置
fseek(fp, 0, SEEK_SET);
char tmp[1024] = { 0 };
//将读取到的数据写到tmp中
ret = fread(tmp, 1, 1023, fp);
if (ret == 0)
{
printf("have no data or error\n");
}
printf("ret:%d-[%s]\n", ret, tmp);
//关闭文件并释放资源
fclose(fp);
return 0;
}
系统调用IO接口
open
函数原型:int open(char *filename, int flag, mode_t mode)
参数内容(文件名, 选项参数-文件打开方式, 权限)
flag参数有必选项和可选项
必选项:O_RDONLY
-只读; O_WRONLY
-只写; O_RDWR
-读写
可选项:O_CREAT
-文件存在则打开,不存在则创建;O_EXCL
-与O_CREAT同时使用,文件存在则报错,不存在创建; O_TRUNC
-打开文件的同时清空原有内容; O_APPEND
-追加写,总是将文件写到末尾
两个选项之间用|
隔开
mode:如果使用了O_CREAT有可能创建新文件,就一定要指定文件权限,最终文件的权限为(mode & ~默认权限)例如mode=777,默认权限002,则文件权限为777 & ~002=775
返回值:一个非负整数–文件描述符–文件的操作句柄;失败返回-1
write
函数原型:ssize_t write(int fd, const char *buf, size_t count)
;参数内容(open返回的文件描述符,要写入文件的数据空间首地址,数据大小)
返回值:返回实际写入文件的数据字节长度;失败返回-1
read
ssize_t read(int fd, void *buf, size_t count);
参数内容(文件描述符,将读取的数据读到buf中, 读取的字节数)
返回值:返回实际读入的字节数,如果读取失败返回-1
lseek
off_t lseek(int fd, off_t offset, int whence)
参数内容(open返回的文件描述符,偏移量,偏移起始位置)
whence:SEEK_SET
-文件起始位置;SEEK_CUR
-文件当前读写位置;SEEK_END
-文件末尾
返回值:成功返回当前位置相对于起始位置的偏移量;失败返回-1
与库函数的fseek唯一区别就是第一个参数不同
注意:使用偏移后尽量再偏移回到起始位置,否则下次忘记了,用的时候会发生一些低级错误
close
int close(int fd)
参数(文件描述符)
功能:通过文件描述符关闭文件,释放资源