【Linux之IO系统编程学习】
项目代码获取:https://gitee.com/chenshao777/linux_-io.git
(麻烦点个免费的Star哦,您的Star就是我的写作动力!)
05.标准IO之 fopen_fgets_fputs
1、fopen函数
FILE *fopen(const char *pathname, const char *mode);
作用:
打开操作文件
返回值:
打开成功返回文件指针
如果失败,则返回NULL
参数:
参数 | 含义 |
---|---|
pathname | 带有路径的文件名 |
mode | 打开模式 |
打开模式:
模式 | 含义 | 文件可否存在 |
---|---|---|
w | 仅写,会清空文件 | 若不存在,则创建新文件 |
a | 追加写入 | 若不存在,则创建新文件 |
r | 仅读 | 必须存在 |
r+ | 可读可写 | 必须存在 |
w+ | 可读可写,会清空文件 | 若不存在,则创建新文件 |
a+ | 可读可写 | 若不存在,则创建新文件 |
举例:
FILE *fd;
/* 以读写的方式打开一个文件,并且会清空文件 */
fd = fopen("./a.txt", "w+");
if(fd == NULL){
printf("打开文件失败!\n");
return 0;
}
更多代码见开头链接
2、fgets函数
char *fgets(char *s, int size, FILE *stream);
作用:
获取文件流数据
返回值:
读取到的字符串指针
参数:
参数 | 含义 |
---|---|
s | 获取数据存放的缓冲区 |
size | 要获取的字节数 |
stream | 获取的目标文件 |
举例:
使用fgets将文件中的内容读出
FILE *fd;
char send_buff[] = "hello linux";
char recv_buff[128] = {0};
/* 以读写的方式打开一个文件,并且会清空文件 */
fd = fopen(argv[1], "w+");
if(fd == NULL){
printf("打开文件失败!\n");
return 0;
}
/*中间有其他操作*/
/*
读取文件数据
注意:需要设置文件读写指针
*/
fseek(fd, 0, SEEK_SET); //fseek函数很重要,设置文件读写指针
fgets(recv_buff, 128, fd);
printf("读取到文件数据: %s\n", recv_buff);
while(1);
fclose(fd);
PS:
1.使用 fseek() 函数将文件读写指针恢复到文件开头(或者用 rewind() 函数)
2.fgets() 是行缓存函数,如果 printf 最后不加 \n,则不会有打印数据,会阻塞在 while(1);
更多代码见开头链接
3、fputs函数
int fputs(const char *s, FILE *stream);
作用:
向文件中写入数据
返回值:
如果成功返回一个非负数,如果失败返回EOF(-1)
参数:
参数 | 含义 |
---|---|
s | 发送数据的字符串首地址 |
stream | 要写入的文件流指针 |
举例:
使用 fputs 向文件中写入数据
FILE *fd;
char send_buff[] = "hello linux";
/* 以读写的方式打开一个文件,并且会清空文件 */
fd = fopen(argv[1], "w+");
if(fd == NULL){
printf("打开文件失败!\n");
return 0;
}
/*
写入数据到文件
过程: 将用户缓冲区数据写入库缓存
当遇到\n或者写满了才会将库缓存写入内核缓存
PS:这里写入的数据中没有\n,但是由于最后调用了fclose,
关闭文件之前会强行刷新缓冲区的数据,所以会将库缓冲数据写入内核缓冲
可以使用 fflush 强制刷新缓冲区
*/
fputs(send_buff, fd);
fflush(fd); //强制将缓存数据写入内核缓存