linux编程之文件编程

本文深入讲解Linux下的文件编程,涵盖头文件、文件打开与关闭、文件属性、读写操作、光标移动、文件描述符等内容,并对比C语言库与Linux系统调用的差异。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1.头文件
  • sys/types.h
  • sys/stat.h
  • fcntl.h
  • 以上为open等的头文件
    C语言库函数fopen等的头文件为stdio.h
2.文件编程之打开文件
  • open(pathname,flag) 打开文件
    pathname:文件路径名字,flag:O_RDONLY 只读,O_WRONLY只写,O_RDWR可读可写。 打开成功返回的是非负数,失败返回的是-1

如果两个参数的open函数打开失败了就用到了三个参数的open函数。fd=open("./test_file",O_RDWR|O_CREAT,0777);
这句话中,设置文件打开方式为可读可写,如果无该文件则创建,0777是值文件的权限,但是由于umask的默认值为0002,创建的权限会是0775,把umask设置为0就可以创建权限为0777

  • creat(pathname,mode) 创建文件
  • close(fd);关闭打开的文件

在这里插入图片描述
在这里插入图片描述

3.文件编程之文件属性
  • r 可读
  • w 可写
  • x 可执行
  • -rwxrwxrwx 横杆表示普通文件,第一个rwx表示文件所有者对于该文件的权限,中间的rwx表示文件所有者所在组的用户对于该文件的权限,最后的rwx表示其他用户对于该文件的权限。
4.文件编程之文件读写
  • write(fd,buf,count) ——文件写操作,fd是打开文件返回的文件描述符,buf是无类型字符缓冲区,count是长度。返回值是代表着写入了多少。会使光标移至末尾。
  • read(fd,buf,count)——文件读操作,fd是打开文件返回的文件描述符,buf是无类型字符缓冲区,count是长度。读文件时会有光标的问题。把光标移到头或者关闭这个文件重新打开。
5.文件编程之光标移动

在这里插入图片描述

  • lseek(fd,offset,whence)——移动光标API,fd——文件描述符。offset——偏移值,负数往前走,正数往后走。whence——光标所在描述,共有三个:SEEK_SET——光标处在文件头,SEEK_CUR——光标处在文件当前光标所在,SEEK_END——光标处在文件结尾。

-lseek(fd,0,SEEK_END)会返回该文件的字节大小。

6.文件编程之文件描述符
  • 文件描述符是在文件编程中很重要的一个东西。他是一个非负整数,当打开一个文件的时候内核向进程返回一个文件描述符,当读写一个文件时,用open和creat返回的文件描述符标识该文件,将其作为参数传递给read和write。

  • 系统会默认存在一些文件描述符,0——标准输入,1——标准输出,2——标准错误。标准输入的键盘,标准输出是控制台。

  • 对于文件的操作完成后一定要关闭该文件(close)

7.文件编程之c语言库的读写文件与linux读写文件差异
  • c语言标准库使用的打开关闭都带有f前缀fopen,fclose等。

7.1 来源

  • open函数是unix(linux)的系统调用函数,返回的是文件描述符。
  • fopen函数是ANSIC标准中的c语言库函数,调用的是不同的内核API,返回的是一个指向文件结构的指针。

7.2 移植性

  • fopen是c标准函数,有良好的移植性。open是unix系统调用,移植性有限。比如windows下相似的功能使用API为 CreatFile

7.3 适用范围

  • fopen是用来操作普通正规文件。
  • open在unix下可以打开一切。毕竟unix万物皆文件

7.4 文件IO层次

  • 越靠近内核的层次就越低,open属于低级文件IO操作。

7.5 缓冲

  • fopen有缓冲,open无

两者之间的差异 可以查看 博客: https://www.cnblogs.com/NickyYe/p/5497659.html

fopen(path,mode)——path表示文件路径,mode表示打开方式:

“r” = “rt”
打开一个文本文件,文件必须存在,只允许读
“r+” = “rt+”
打开一个文本文件,文件必须存在,允许读写
“rb”
打开一个二进制文件,文件必须存在,只允许读
“rb+”
打开一个二进制文件,文件必须存在,允许读写
“w” = “wt”
新建一个文本文件,已存在的文件将被删除,只允许写
“w+” = “wt+”
新建一个文本文件,已存在的文件将被删除,允许读写
“wb”
新建一个二进制文件,已存在的文件将被删除,只允许写
“wb+”
新建一个二进制文件,已存在的文件将被删除,允许读写
“a” = “at”
打开或新建一个文本文件,只允许在文件末尾追写
“a+” = “at+”
打开或新建一个文本文件,可以读,但只允许在文件末尾追写
“ab”
打开或新建一个二进制文件,只允许在文件末尾追写
“ab+”
打开或新建一个二进制文件,可以读,但只允许在文件末尾追写

fwrite(buf,size,cmd,fp)——size表示一次写的大小,cmd表示写多少次,fp为文件流,buf为缓冲区
返回值与写的次数有关

fread(buf,size,cmd,fp)——同fwrite

光标移动使用 fseek(fp,offset,mode)——使用同lseek,但是返回值只会返回0跟1。

关闭文件用fclose(fp)

fputc(c,fp)——写一个字符或者整形到文件

fgetc(fp)——从文件读一个字符或整形

feof(fp)——判断是否到达文件尾部,是则返回1,否则返回0

8. 文件编程之字符串API
  • strstr(string,substring)——查找字符串中是否包含子字符串substring,是则返回指向第一次出现的位置的指针,反则返回NULL,string是查找的字符串,substring是要查找的字符串。
  • strsep(&buf,con)——以con为条件来切割字符串,返回切割掉字符串指针,第一个参数是字符串的地址,第二个参数是切割的东西。

例:

#include <stdio.h>
#include<string.h>
int main()
{
  char str[] = "mv a.c b.c";
  char *p;
  char *buff;
  buff=str;
  p = strsep(&buff, " ");
  while(p!=NULL)
  {
    printf("%s\n", p);
    p = strsep(&buff, " ");
  }
  return 0;
}

结果:
在这里插入图片描述

  • fgets(buf,len,fp)——读取一行,len是读取的最大长度,buf是存放的缓冲区,fp是fopen返回的文件流。
    fgets函数:原型:char * fgets(char * buf, int bufsize, FILE * stream);功能:从文件结构体指针stream中读取数据,每次读取一行。说明:读取的数据保存在buf指向的字符数组中,每次最多读取bufsize-1个字符(第bufsize个字符赋值为\0)。如果该行不足bufsize个字符,则读完该行就结束,如果该行超过bufsize-1个字符,则fgets只返回一个不完整的行,buf缓冲区以\0字符结束,下一次fgets调用会继续读取该行剩余的字符;头文件:stdio.h;返回值:若读入成功,返回与参数buf相同的字符指针,若读入过程中遇到EOF或发生错误,返回NULL指针。所以当遇到返回值为NULL的情况时,应使用ferror或feof函数检查是发生错误还是遇到EOF。
9. linux系统之系统架构

参考博文: https://blog.youkuaiyun.com/shilion163/article/details/80365173

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值