Linux-C 文件操作

Linux-C 文件操作

一、简述

二、系统I/O

三、标准I/O

四、标准输入/输出重定向

五、文件操作补充

六、上述文件操作函数代码示例

一、简述

**

    基于Linux环境下C语言编程的文件操作。

     两种操作文件的方式:

    1、系统I/O:系统调用接口,`open(), read(), write(), lseek(), close()`。是操作系统直接提供的编程接口(API)。

    2、标准/IO:标准库的I/O函数,fopen(), fread(), fwrite(), fseek(), fclose(),是对系统调用接口进一步封装。

    系统I/O常用于硬件级别,可以设置读缓冲区,一般没有写缓冲区;

    标准I/O常用于软件级别,自带读写缓冲区。

1、文件基本概念
C程序把文件分为ASCII文件和二进制文件,ASCII文件又称文本文件,二进制文件和文本文件(也称ASCII码文件)二进制文件中,数值型数据是以二进制形式存储的,

而在文本文件中,则是将数值型数据的每一位数字作为一个字符以其ASCII码的形式存储,因此,文本文件中的每一位数字都单独占用一个字节的存储空间,

而二进制文件则是把整个数字作为一个二进制数存储的,并非数值的每一位数字都占用单独的存储空间,无论一个C语言文件的内容是什么,

它一律把数据看成是字节构成的序列,即字节流,对文件的存取也是以字节为单位的,输入/输出的的数据流仅受程序控制而不受物理符号(如回车换行符)的控制,所以说C语言文件为流式文件

C语言的文件存取有两种方式:顺序存取和直接存取

(C语言有缓冲型和非缓冲型两种文件系统,缓冲型文件系统是指系统自动自动在内存中为每一个正在使用的文件开辟一个缓冲区,

作为程序与文件之间数据交换的中间媒介,也就是读文件时,数据先送到缓冲区,再传给C语言程序或则外存上,缓冲文件系统利用文件指针标识文件,

而非缓冲文件系统是不会自动设置文件缓冲区,缓冲区必须由程序员自己设定,缓冲型中的文件操作,也称高级文件操作,

高级文件操作函数大多是ANSIC定义的可移植的文件操作函数,具有跨平台和可移植能力,可解决大多数文件操作问题)

##二、系统I/O

   **2.1 open()函数**

功能 打开一个指定的文件并获得文件描述符,或者创建一个新文件

头文件	
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
原型
	int open(const char *pathname, int flags);
    int open(const char *pathname, int flags, mode_t mode);

***参数***	
pathname	要打开的文件路径名称
**flags**	
O_RDONLY		只读方式打开文件	这三个参数互斥
O_WRONLY		只写方式打开文件
O_RDWR		读写方式打开文件
O_CREAT		如果文件不存在,则创建该文件	 
O_TRUNC		如文件已经存在,则删除文件中原有数据	 
O_APPEND	以追加方式打开文件	 
mode	如果文件被新建,指定其权限为mode(八进制表示法)
返回值	成功	大于等于0 的整数(即文件描述符)
失败	-1,并且errno会被设置

**补充说明:**

1)flags 的各种取值可以用位或的方式叠加起来,例如创建文件的时候需要满足这样的
选项:读写方式打开,不存在要新建,如果存在了则清空。则flags 的取值应该是:O_RDWR | O_CREAT | O_TRUNC。
2)mode 是八进制权限,比如0644,或者0755 等。也可以是使用系统已定义的

              S_IRWXU  00700 user (file owner) has read,  write,  and  execute permission //用户可读写执行权限

              S_IRUSR  00400 user has read permission//用户写权限

              S_IWUSR  00200 user has write permission//用户写权限

              S_IXUSR  00100 user has execute permission//用户执行权限      (更多选项可查询man手册:man 2 open)

              比如新创建的文件权限只需要读写权限:S_IRUSR  | S_IWUSR  

**3)文件描述符**

         其实是一个数组的下标值,在内核中打开的文件是用 file 结构体来表示的,每一个结构体都会有一个 指针来指向它们,这些指针被统一存放在一个叫做 fd_array 的数组当中,而这个数组被存 放在一个叫做 files_struct 的结构体中,该结构体是进程控制块 task_struct 的重要组成部分。

     **2.2 close()函数**

功能:关闭文件并释放相应资源

头文件

#include <unistd.h>


原型

int close(int fd);

    **参数**	     
     fd	要关闭的文件的描述符

返回值
成功
0
失败
-1


备注

重复关闭一个已经关闭了的文件或者尚未打开的文件是安全的。

     **2.3 read()函数**

功能

从指定文件中读取数据

头文件

#include <unistd.h>


原型

ssize_t 
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
//1.创建文件file1,写入字符串“abcdefghijklmn”; //2.创建文件file2,写入字符串“ABCDEFGHIJKLMN”; //3.读取file1中的内容,写入file2,使file2中的字符串内容为“abcdefghijklmn ABCDEFGHIJKLMN” 创建新文件,该文件具有用户读写权限。 //2.采用dup/dup2/fcntl复制一个新的文件描述符,通过新文件描述符向文件写入“class_name”字符串; //3.通过原有的文件描述符读取文件中的内容,并且打印显示; 1.输入文件名称,能够判断文件类型,判断实际用户对该文件具有哪些存取权限; ?2.要求打印出文件类型信息,inode节点编号,链接数目,用户id,组id,文件大小信息; ?3.修改文件的权限为当前用户读写,组内用户读写,组外用户无权限 新建文件,设置文件权限屏蔽字为0; 2.建立该文件的硬链接文件,打印硬链接文件的inode节点号和文件大小; ? 3.建立该文件的软链接文件,打印软链接文件的inode节点号和文件大小;打印软链接文件中的内容; 4.打印源文件的inode节点号,文件大小和链接数目; ? 5.调用unlink对源文件进行操作,打印源文件链接数目; .新建/home/user目录; 2.把当前工作路径移至/home/user目录; 3.打印当前工作路径; ?编写程序完成以下功能: ?1.递归遍历/home目录,打印出所有文件和子目录名称及节点号。 ?2.判断文件类型,如果是子目录,继续进行递归遍历,直到遍历完所有子目录为止

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值