学习IO基础笔记

1.在 Linux 中,文件总共被分成了 7 种,他们分别是:

1,普通文件 (regular) :存在于外部存储器中,用于存储普通数据。

2, 目录文件 (directory) :用于存放目录项,是文件系统管理的重要文件类型。

 3,管道文件 (pipe) :一种用于进程间通信的特殊文件,也称为命名管道 FIFO

 4,套接字文件 (socket) :一种用于网络间通信的特殊文件。

5,链接文 (link) :用于间接访问另外一个目标文件,相当于 Windows 快捷方式。

 6,字符设备文件 (character) :字符设备在应用层的访问接口。

7,块设备文件 (block) :块设备在应用层的访问接口。

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

文件

#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_EXCL:如果使用 O_CREAT 选项且文件存在,则返回错误消息。

O_NOCTTY:如果文件为终端,那么终端不可以作为调用 open()系统调 用的那个进程的控制终端。

O_TRUNC:如文件已经存在,则删除文件中原有数据。

O_APPEND:以追加方式打开文件。

mode

如果文件被建,指定其权限为 mode  (八进制表示法)

回值

成功

大于0 的整数 (即文件描述符)

- 1

关闭文件并释放相应资

文件

#include <unistd.h>

int close(int fd);

参数

fd:即将要关闭的文件的描述符

回值

成功

0

- 1

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

从指定文件中读取数

文件

#include <unistd.h>

ssize_t read(int fd, void *buf, size_t count);

参数

fd:从文件fd 中读数

buf:指向存放读到的数据的缓冲区

count:想从文件 fd 中读取的字节数

回值

成功

实际读到的字节数

- 1

实际读到的字节数小于等于 count

将数据写入指定的文件

文件

#include <unistd h>

ssize_t write(int fd, const void *buf, size_t count);

参数

fd:将数据写入文件 fd

buf指向即将要写入的数据

count:要写入的字节数

回值

成功

实际写入的字节数

- 1

实际写入的字节数小于等于 count

整文件位置偏移量

文件

#include <sys/types.h>

#include <unistd.h>

off_t lseek(int fd, off_t offset, int whence);

参数

fd:要调整位置偏移量的文件的描述符

offset:新位置偏移量相对基准点的偏移

whence:基准点

SEEK_SET:文件开头处

SEEK_CUR:当前位置

SEEK_END:文件末尾处

回值

成功

新文件位置偏移量

- 1

复制文件描述符

文件

#include <unistd.h>

int dup(int oldfd);

int dup2(int oldfd, int newfd);

参数

oldfd:要复制的文件描述符

newfd:指定的新文件描述符

回值

成功

新的文件描述符

- 1

控制

文件

#include <sys/ioctl.h>

int ioctl(int d, int request, ...);

参数

d:要控制的文件描述符

request:针对不同文件的各种控制命令字

变参:根据不同的命令字而不同

回值

成功

一般情下是 0 ,但有些特定的请求将返回非负整数。

- 1

控制

文件

#include <unistd.h>

#include <fcntl.h>

int fcntl(int fd, int cmd, .../* arg */ );

参数

fd:要控制的文件描述符

cmd:控制命令

变参:根据不同的命令字而不同

回值

成功

根据不同的 cmd ,返回值不同

- 1

存映射

文件

#include <sys/mman.h>

void *mmap(void *addr, size_t length,

int prot, int flags, int fd, off_t offset);

参数

addr

映射内存的起始地址

如果该参NULL,  则系统将会自动寻找一个合适的起始地址,一 都使用这个值。

如果该参数NULL,则系统会以此为依据来找到一个合适的起始地 址。在 Linux 中,映射后的内存起始地址必须是页地址的整数倍。

length

映射内存大小。

prot

映射内存的保护权限

PROT_EXEC : 可执行

PROT_READ : 可读

PROT_WRITE : 可写。

PROT_NONE: 不可访问。

flags

当有多个进程同时映射了这块内存时,该参数可以决定在某一个进程 内使映射内存的数据发生变更是否影响其他进程,也可以决定是否影 响其对应的文件数据

以下两个选项互斥:

MAP_SHARED : 所有的同时映射了这块内存的进程对数据的变更均 可见,而且数据的变更会直接同步到对应的文件 (有时可能还需要调 msync( )或者 munmap( )才会真正起作用) 。

MAP_PRIVATE : MAP_SHARED 相反,映射了这块内存的进程对数 据的变更对别的进程不可见,也不会影响其对应的文件数据。

以下选项可以位或累加:

MAP_32BIT :在早期的 64 x86 处理器上,设置这个选项可以将线程 的栈空间设置在最2GB 空间附近,以便于上下文切换时得到更好 的表现性能,但现代的64 x86 理器本身已经解决了这个问题, 因此这个选项已经被弃用了。

MAP_ANON :等同于 MAP_ANONYMOUS已弃用。                MAP_ANONYMOUS :名映射。该选项使得该映射内存不与任何文件 关联,一般来讲参数 fdoffset 会被忽略 (但是可移植性程序需要将 fd 设置为-1) 。另外,这个选项必须跟 MAP_SHARED 一起使用。

获取指定文件的文件指

文件

#include <stdio.h>

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

参数

path即将要打开的文件

mode

r” :  以只读方式打开文件,要求文件必须存在

r+” :  以读写方式打开文件,要求文件必须存在。

w” :  以只写方式打开文件,文件如果不存在将会创建新文件,如果 在将会将其内容清空。

w+” :  以读写方式打开文件,文件如果不存在将会创建新文件,如果存 在将会将其内容清空。

a” :  以只写方式打开文件,文件如果不存在将会创建新文件,且文件位 置偏移量被自动定位到文件末尾 (即以追加方式写数据) 。

a+” :  以读写方式打开文件,文件如果不存在将会创建新文件,且文件 位置偏移量被自动定位到文件末尾 (即以追加方式写数据) 。

回值

成功

指针

NULL

文件指针和文件描述符的关系如下图所示:

关闭指定的文件并释放其资源

文件

#include <stdio.h>

int fclose(FILE *fp);

参数

fp:即将要关闭的文件

回值

成功

0

EOF

获取指定文件的一个字

文件

#include <stdio.h>

int fgetc(FILE *stream);

int getc(FILE *stream);

int getchar(void);

参数

stream:文件指针

回值

成功

读取到的字符

EOF

当返回 EOF 时,文件 stream 可能已达末尾,或者遇到错误

讲一个字符写入一个指定的文件

文件

#include <stdio.h>

int fputc(int c, FILE *stream);

int putc(int c, FILE *stream);

int putchar(int c);

参数

c:要写入的字符

stream:写入的文件指针

回值

成功

写入到的字符

EOF

feof():判断一个文件是否到达文件末尾

ferror()判断一个文件是否遇到了某种错误

文件

#include <sys/ioctl.h>

int feof(FILE *stream);

int ferror(FILE *stream);

参数

stream:进行判断的文件指针

回值

feof

如果文件已达末尾则返回真,否则返回假

ferror

如果文件遇到错误则返回真,否则返回假

从指定文件读取最多一行数据

文件

#include <sys/ioctl.h>

char *fgets(char *s, int size, FILE *stream);

char *gets(char *s);

参数

s 自定义缓冲区指针

size 自定义缓冲区大小

stream:即将被读取数据的文件指针

回值

成功

自定义缓冲区指针 s

NULL

1gets( )缺省从文件 stdin 读入数据

2当返回 NULL 时,文件 stream 可能已达末尾,或者遇到错误

将数据写入指定的文件

文件

#include <sys/ioctl.h>

int fputs(const char *s, FILE *stream);

int puts(const char *s);

参数

s 自定义缓冲区指针

stream:即将被写入数据的文件指针

回值

成功

非负整数

EOF

puts( )缺省将据写入文件 stdout

从指定文件读取若干个数据块

文件

#include <sys/ioctl.h>

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

参数

ptr 自定义缓冲区指针

size:数据块大小

nmemb:数据块个数

stream:即将被读取数据的文件指针

回值

成功

读取的数据块个数,等于 nmemb

取的数据块个数,小于 nmemb 或等于 0

当返回小与nmemb 时,文件 stream 可能已达末尾,或者遇到错误

将若干块数据写入指定的文件

文件

#include <sys/ioctl.h>

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

参数

ptr 自定义缓冲区指针

size:数据块大小

nmemb:数据块个数

stream:即将被写入数据的文件指针

回值

成功

入的数据块个数,等于 sinmembze

写入数据块个数,小于 nmemb 或等于 0

设置指定文件的当前位置偏移量

文件

#include <sys/ioctl.h>

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

参数

stream:需要设置位置偏移量的文件指针

offset:新位置偏移量相对基准点的偏移

whence:基准点

SEEK_SET:文件开头处

SEEK_CUR:当前位置

SEEK_END:文件末尾处

回值

成功

0

- 1

获取指定文件的当前位置偏移量

文件

#include <sys/ioctl.h>

long ftell(FILE *stream);

参数

stream:需要返回当前文件位置偏移量的文件指针

回值

成功

文件位置偏移量

- 1

将指定文件的当前位置偏移量设置到文件开头处

文件

#include <sys/ioctl.h>

void rewind(FILE *stream);

参数

stream:需要设置位置偏移量的文件指针

回值

函数的功能是将文件 strean 的位置偏移量置位到文件开头处。

将格式化数据写入指定的文件或者内存

文件

#include <stdio.h>

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

int printf(const char *restrict format, ...);

int snprintf(char *restrict s, size_t n,const char *restrict format, ...); int sprintf(char *restrict s, const char *restrict format, ...);

参数

stream:写入数据的文件指

format:格式控制

s:写入数据的自定义缓冲区

n: 自定义缓冲区的大小

回值

成功

成功写入的字节数

- 1

从指定的文件或者内存中读取格式化数据

文件

#include <stdio.h>

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

int sscanf(const char *restrict s, const char *restrict format, ... );

参数

stream:读出数据的文件指

format:格式控制

s:读出数据的自定义缓冲区

回值

成功

确匹配且赋值的数据个数

EOF

2. 目录检索

打开目录以获得目录指

文件

#include <sys/types.h>

#include <dirent.h>

DIR *opendir(const char *name);

参数

name 目录名

回值

成功

录指针

NULL

读取目录项

文件

#include <dirent.h>

struct dirent *readdir(DIR *dirp);

参数

dirp:读出目录项的目录指针

回值

成功

录项指针

NULL

从目录中读到的所谓目录项,是一个这样的结构体:

struct dirent

{

ino_t d_ino; // 文件索引号

off_t d_off; //  目录项偏移量

unsigned short d_reclen; // 该目录项大

unsigned char d_type; // 件类型

char d_name[256]; // 文件名

};

  • 5
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值