C语言操作接口
1.打开
fopen
FILE *fopen(const char *path, const char *mode)
path
:打开文件的方式(文件路径+文件名称)mode
: 以何种方式打开
r
:以只读方式打开,当文件不存在时,就打开失败
r+
:以读写方式打开,当文件不存在时,就会打开失败
w
:以只写方式打开,如果文件不存在,则创建文件,如果文件存在,则会截断(清空)文件
w+
: 以读写方式打开,如果文件不存在,则创建文件,如果文件存在,则会截断(清空)文件
a
:以追加方式打开,只支持写,如果文件不存在,则创建文件,当前的文件流指针指向文件的末尾
a+
:以追加方式打开,支持读和写,如果文件不存在,则创建文件,当前的文件流指向了文件的末尾
- 返回值:打开成功返回文件流指针,打开失败返回
null
2.写
fwrite
size_t fwrite(const void *ptr, size_t size, size_t nmemb, FILE *stream);
ptr
: 要往文件中写的内容size
: 要写入块的大小,单位是字节nmenb
: 块的个数,单位是个, 写入的字节数量=size
*nmemb
一般在程序中使用的时候,讲size设置为1,nmemb
就表示写入发字节数量- `stream``:文件流指针
- 返回值:返回写成功的块的个数
3.读
fread
size_t fread(void *ptr, size_t size, size_t nmemb, FILE *stream);
pre
:将要读入的内容保存在哪里
size
: 每次读块的大小
nmemb
:块的个数
stream
:文件流指针返回值:成功读到的块的个数
4.偏移
fseek
int fseek(FILE *stream, long offset, int whence);
stream:
文件流指针
offset:
偏移量
whence:
SEEK_SET
SEEK_CUR
SEEK_END
5.关闭
fclose
int fclose(FILE *fp);
- 关闭文件流指针
举例1
写文件
#include <stdio.h>
#include <string.h>
int main()
{
FILE *fd = fopen("myfile", "w");
if(!fp){
printf("fopen error!\n");
}
const char *msg = "hello!\n";
int count = 5;
while(count --){
fwrite(msg, strlen(msg), 1, fp);
}
fclose(fp);
return 0;
}
举例2
读文件
#include <stdio.h>
#include <string.h>
int main()
{
FILE *fd = fopen("myfile", "r");
if(!fp){
printf("fopen error!\n");
}
char buf[1024];
const char *msg = "hello!\n";
while(1){
//注意返回值和参数
ssize_t s = fread(buf, 1, strlen(msg), fp);
if(s > 0){
buf[s] = 0;
printf("%s", buf);
}
if(feof(fp)){
break;
}
}
fclose(fp);
return 0;
}
系统调用操作接口
1.打开
open
int open(const char *pathname, int flags, mode_t mode);
pathname
: 要打开的文件名称(路径+名称)
flags
: 以何种方式打开
必须的宏,三个,但只能出现一个
O_RDONLY:只读方式
O_WRONLY:只写方式
O_RDWR:读写方式可选的宏
O_APPEND:追加
O_TRUNC:截断
O_CREAT:文件不存在创建使用方式,必须的宏和可选的宏之间使用按位或(eg:O_RDWR | O_CREAT)
mode
权限
新创建出来的文件设置权限
传参的时候,传递八进制数字就可以- 返回值:
打开成功,返回大于等于0的数字,是文件描述符
打开失败,返回-1
2.写
write
ssize_t write(int fd, const void *buf, size_t count);
fd
: 文件描述符,open
的返回值
buf
: 往文件里写的内容
count
: 写的内容的大小返回值:写成功发字节数量
3.读
read
ssize_t read(int fd, void *buf, size_t count);
fd
: 文件描述符,open
的返回值
buf
: 将要读到的内容放到那里去
count
:最大可以读多少个,单位字节返回值:返回读到的字节数量
4.偏移
lseek
off_t lseek(int fd, off_t offset, int whence);
fd
:文件描述符
offset
:偏移量
whence
SEEK_SET
SEEK_CUR
SEEK_END
5.关闭
close
int close(int fd);
* 关闭文件描述符
举例1
写文件
#include <stdio.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>
#include <string.h>
int mian()
{
umask(0);
//0644是初始权限
int fd = open("myfile", O_WRONLY | 0_CREAT, 0644);
if(fd < 0)
{
perror("open");
return 1;
}
int count = 5;
const char *msg = "hello\n";
int len = strlen(msg);
while(count --){
write(fd, msg, len); //msg:缓冲区首地址,len:本次读取期望写入多少个自己的数据,返回值:实际写入了多少字节数据
}
fclode(fd);
return 0;
}
举例2
读文件
#include <stdio.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>
#include <string.h>
int mian()
{
umask(0);
//0644是初始权限
int fd = open("myfile", O_RDONLY);
if(fd < 0)
{
perror("open");
return 1;
}
const char *msg = "hello\n";
char buf[1024];
while(1){
ssize_t s = read(fd, buf, strlen(msg));
if(s > 0){
printf("%s", buf);
}else{
break;
}
}
fclode(fd);
return 0;
}
总结
- 上述的
fopen
,fclose
,fread
,fwrite
都是C标准库当中的函数,称为库函数,而open
,close
,read
,write
,lseek
都属于系统提供的接口,称为系统调用接口 - 系统调用接口和库函数的关系,可以认为
f#
系列的函数,都是对系统调用的封装,为了方便二次开发