fopen linux 路径_Linux应用编程之文件操作 库函数篇

本文介绍了Linux环境下,使用C库函数进行文件操作的方法,包括fopen、fread、fwrite等关键接口的用法,强调了库函数的平台移植性和与系统调用的区别。
摘要由CSDN通过智能技术生成
5e38710975237f5f685ccd295f4a8b9a.gif 关注、星标公众号,直达精彩内容

f8420238bf4b8ad2bbff01f81f5e6699.png

ID:嵌入式情报局

作者:情报小哥

1库函数文件操作

    前面两篇文章小哥通过系统调用接口为大家介绍了文件操作,那么今天小哥简单为大家介绍一下库函数如何进行文件操作。

    之前介绍的系统调用接口是依赖于Linux操作系统的,如果使用了该接口的应用程序移植到其他平台就可能存在不兼容问题,而C库函数独立于平台其接口都是一致的,所以移植性会好很多。

f32e8be63e9d5022cfdc2bc258e6a0da.png

2库函数接口

    对于库函数接口其实大体与系统调用差不多,因为大部分库函数都会直接或者间接的使用系统调用,下面小哥就简单介绍一下库函数接口:

FILE *fopen(const char *path, const char *mode)

  • path : 文件名,包含路径,缺省为当前路径,例如"home/test.c"

  • mode : 打开的方式,"r","rb"表示只读,"w","wb"表示只写,等等。

  • 返回值 : 成功返回文件指针(即文件的描述),失败返回NULL。

  • 功能 : 以mode方式打开path指向的一个文件

注意 : 其中rb中的b表示操作二进制文件,而没有b表示操作文本文件,在Windows中是有区分,而在linux中没有区别。

size_t fread(void *ptr, size_t size, size_t nmemb, FILE *stream)

  • ptr : 接受数据buff

  • size : 每段的字节个数

  • nmemb:字段的个数

  • stream : 所要打开的文件指针,即文件流

  • 返回值 : 实际读取到的字节数

  • 功能 : 从文件stream中读取数据到ptr指向的buff中

注意 : size相当于每次读取的字节个数,而nmenb表示读取的次数,如果从文件file中读取10个字节可以用如下语句:

  fread(buffer,10,1,file);  
  fread(buffer,5,2,file);  
  fread(buffer,1,10,file);   

size_t fwrite(const void *ptr, size_t size, size_t nmemb, FILE *stream)

  • ptr : 写入数据buff

  • size: 每段的字节个数

  • nmemb:字段的个数

  • stream : 所要写入的文件指针,即文件流

  • 返回值 : 实际写入的字节数

  • 功能 : 与fread刚好相反

int fgetc(FILE *stream)

  • stream : 所要读取的文件指针,即文件流

  • 返回值 : 文件字符的ASCII码值,出错时,返回EOF(-1)

  • 功能 : 从指定的stream文件中读取一个字符

int fputc(int c,FILE *stream)

  • stream : 所要读取的文件指针,即文件流

  • c : 所要写入的一个字符

  • 返回值 : 写入文件字符的ASCII码值,出错时,返回EOF(-1)

  • 功能 : 向指定文件中写入一个字符

int fscanf(FILE *stream, const char *format, ...);

  • stream : 所要读取的文件指针,即文件流

  • format : 也就是我们平时使用的("%d",&i)这样的格式化语句

  • 返回 : 实际读取的数据个数,否则EOF(-1)

  • 功能 : 从指定文件stream中格式化读取数据到i中

int fprintf(FILE *stream, const char *format, ...);

  • stream : 所要写入的文件指针,即文件流

  • format : 也就是我们平时使用的("%d",i)这样的格式化语句

  • 返回值 : 写入文件中的字节数

  • 功能 : 向指定文件stream中格式化写入数据i

int fseek(FILE *stream, long offset,int whence);

  • stream : 所要写入的文件指针,即文件流

  • offset : 偏移值

  • whence : 指定偏移方式:

  • SEEK_SET 从距文件开头offset 位移量为新的读写位置

  • SEEK_CUR 以目前的读写位置往后增加offset 个位移量

  • SEEK_END 将读写位置指向文件尾后再增加offset 个位移量

  • 返回值 : 调用成功为0,失败为EOF(-1)

  • 功能 : 控制文件读写指针偏移,与之前系统调用类似。

char * getcwd(char* buffer, size_t size)

  • buffer : 路径存在的缓存区

  • size : buff所定义的大小

  • 功能 : 用于获得当前程序工作目录的绝对路径

注意:该函数有两种用法:

01

方法1 

#define MAX_NAME_SIZE 255
char path[MAX_NAME_SIZE] ={0};
getcwd(path,sizeof(path)); 

    将工作目录的绝对路径复制到buf所指向的空间中,但如果路径长度大于size,则会返回NULL。

02

方法2 

char *path = NULL;
path = getcwd(NULL,0);
free(path); //释放内存

    getcwd内部会调用malloc动态分配内存,使用完后记得释放缓冲以防止内存泄漏。

int mkdir(char* dir, int mode)

  • dir : 所需要创建的目录名称

  • mode : 创建的方式,比如0777,表示拥有所有权限

  • 返回值 :若目录创建成功,则返回0;否则返回-1

  • 功能 : 以mode方式创建一个以参数pathname命名的目录,mode定义新创建目录的权限

注意 : mode需要配合 mode_t umask(mode_t mask); 函数使用,否则可能最终创建的方式与mode不一致,具体可以参考umask函数。

3最后

    这里小哥就介绍了Linux库函数文件操作几个非常重要的API,还有其他API比如ftell - 获得当前文件指针位置rewind - 将文件指针指向开头等等,大家可以通过查找相关手册学习了解,或者下次使用到了具体查阅系统手册,今天就到这里了,下期见!

我是情报小哥,一个90后嵌入式自学玩家!

76c64ffc523e718d9c35c210d309b991.gif

47e9b6b8b47ebd2f2220c365557dda79.png

长按前往图中包含的公众号关注

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值