废话说在前面
在Linux
中,有两种方式可操作文件,一种是C标准库
的文件操作API来操作,另一种则是Linux
的系统调用API
。C标准库
的文件相关API是带f开头的,如fopen
、fwrite
、fread
等;Linux
的系统调用相关API则是open
、write
、read
。
这次学习的是C标准库的方式。
查看相关API如何使用
在Linux
中查看函数的使用方式都不用google、baidu,因为Linux自带man手册
。
1、fopen函数
Linux shell终端
执行man fopen
即可查看API使用方法。
#include "stdio.h"
表明fopen
在这个头文件中有声明,使用这个函数就包括这个头文件。
作用:打开文件
参数 | 解释 |
---|---|
path | 文件名,不写路径就默认是当前路径下 |
mode | 以什么方式打开,读?写?取值是r、r+、w、w+等 |
打开方式的英文很简单,一看就懂是干嘛。
2、fwrite函数
作用:写文件
参数 | 解释 |
---|---|
ptr | 要写入的内容 |
size | 数据项的大小 |
nmemb | 写入的数据项 |
stream | 文件指针,文件的描述符,类似于ID |
size
和nmemb
可以理解为,nmemb
是写的次数,size
是每次要写入多少
3、fread函数
man手册
很人性化,知道write
和read
是经常一起操作所以都放一起,而且它们的参数相同。
作用:从文件中读内容
参数 | 解释 |
---|---|
ptr | 要写入的内容 |
size | 数据项的大小 |
nmemb | 读入的数据项 |
stream | 文件指针,文件的描述符,类似于ID |
size
和nmemb
可以理解为,nmemb
是读的次数,size
是每次要读出多少
4、fclose函数
作用:关闭文件
参数 | 解释 |
---|---|
stream | 文件指针 |
5、fflush函数
C库函数有个啥缓冲区的东西,使用这个函数可以将要写入的数据立即写入文件中。
作用:将尚未写入文件内容立即写入。用于确保前面操作的数据被写入到文件中。
参数 | 解释 |
---|---|
stream | 文件指针 |
6、fseek函数
作用:用于设置下一次读写函数操作的位置
参数 | 解释 |
---|---|
stream | 文件指针 |
offset | 指定的位置 |
whence | 该参数定义了offset 的意义,取值为SEEK_SET 、SEEK_END 、SEEK_CUR |
当whence
是SEEK_SET
时,offset
是一个绝对位置,例如offset
为0时就是设置读写位置到文件开头。
当whence
是SEEK_END
时,offset
是一个相对位置,这个位置是相对文件尾来说的。
当whence
是SEEK_CUR
时,offset
是一个相对位置,这个位置是相对当前位置来说的。
使用相关函数读写文件
c_lib_file_io.c
:
#include "stdio.h"
#include "string.h"
#include "stdlib.h"
const char buf[] = "I am the King of the world\r\n";
FILE *fp = NULL; //定义文件指针
char str[100]; //定义字符串
int len;
int main(int argc, char **argv)
{
if(argc != 2)
{
printf("Usage: %s + <read(or write)>\r\n",argv[0]); //打印用法
exit(1);
}
if(strcmp(argv[1],"write") == 0)
{
fp = fopen("c_lib_file_io.txt", "w+"); //可读可写方式打开文件,没有该文件则创建
}
else if (strcmp(argv[1],"read") == 0)
{
fp = fopen("c_lib_file_io.txt", "r+"); // 可读可写方式打开文件,文件指指向文件开头
}
if (NULL == fp)
{
printf("failed to open file\r\n");
return 0;
}
if(strcmp(argv[1],"write") == 0)
{
//每次写入一字节,写入总长度 = strlen(buf)
fwrite(buf, 1, strlen(buf), fp);
fwrite("AresXu\r\n", 1, strlen("AresXu\r\n"), fp);
fflush(fp);
printf("aaa-dyy\r\n");
}
else if(strcmp(argv[1],"read") == 0)
{
printf("bbb-dyy\r\n");
fseek(fp, 0, SEEK_SET); //这里将文件指针重设到文件开头,从头开始读
len = fread(str, 100, 1, fp);
printf("file content : %s\n nread len = %d\r\n", str, len);
}
else
{
printf("Usage: %s + <read(or write)>\r\n",argv[0]); //打印用法
fclose(fp); //关闭文件
exit(1);
}
fclose(fp); //关闭文件
return 0;
}
编译程序:
gcc -o c_lib_file_io c_lib_file_io.c
写入数据:
./c_lib_file_io write
读出数据:
./c_lib_file_io read
读写结果: