2021-04-01linux I/O

这段时间学习linux高级编程,我将这几天学习的东西总结写在这篇文章作为笔记,加强记忆,同时方便今后复习(还在整理中……)
与之前c学的语言相比多了很多函数和头文件
exit(int status)函数
*exit可以立即关闭该进程里打开的文件描述符,后面学进程的时候,exit可以关闭子进程并返回状态值给父进程
*exit(0): 正常执行程序并退出程序,exit(1): 非正常执行导致退出程序。0和1也可写成EXIT_SUCCESS和EXIT_FAILURE
因为#include<stdlib.h>里宏定义了#define EXIT_SUCCESS 1和#define EXIT_FAILURE 0
error
存放错误号
strerror 函数 ( char * **strerror(int errnum)**)
*从内部数组中搜索错误号 errnum,并返回一个指向错误消息字符串的指针
*参数errnum:错误编号(通常是error)。函数返回一个指向错误信息字符串的指针,错误信息字符串描述错误编号errnum。
perror**函数(void perror(const char *str))
*把一个描述性错误消息输出到标准错误 stderr。首先输出字符串 str,然后一个冒号、一个和空格然后输出错误号对应的错误信息。
*perror相当于strerror和error的结合,一步到位
例如:错误信息是No such file or directory

perror("open()");输出结果:open(): No such file or directory
printf("open():%s\n",strerror(error));输出结果:open():No such file or directory

标准I/O:

一组相关数据的有序集合

文件类型:

常规文件:r (regular)
目录文件:d (directory)
字符设备文件:c (char)
块设备文件:b (bulk)
管道文件:p (pipe) (windows不支持)
套接字文件: s(socket)
符号链接文件:l (link)(windows不支持)

标准IO

标准I/O是ANSI C中定义好的一些用于输入和输出的一组函数,通过这些函数进行输入和输出。
主流操作系统(windows,Linux等)上都有ANSI C 所以标准I/O可用性,可移植性很高。
(标准I/O通过缓存机制减少系统调用,增加效率。)

FILE

FILE是一个结构体。
标准I/O的所有操作都是围绕FILE进行的。
在windows中分为
二进制流:在流中流动的数据是以字符形式出现
换行符 ‘\n’
文本流:指流动的是二进制数字序列,若流中有字符,则用一个字节的二进制ASCII码表示,若是数字,则用一个字节的二进制数标识。在流入流出时,对\n符号不进行变换。
换行符"\r’’\n’
linux
换行符:’\n’

流的缓冲类型

全缓冲:当流的缓冲区无数据或无空间才执行实际的I/O操作。(写入时)
行缓冲
当输入和输出中遇到换行符’\n’时,进行I/O操作。
(当流和一个终端关联时,是典型的行缓冲)
无缓冲
数据直接写入文件,流不进行缓冲。
标准I/O预定义3个流

标准输入流0STDIN_FILENOstdin
标准输出流1STDOUT_FILENOstdout
标准错误流2STDEER_FILENOstderr
打开流fopen

FILE *fopen(const char *path,const char *mode);
成功时返回流指针;出错返回NULL
例:

int main()
{
FILE *fp;
if((fp=fopen("/home/linux/a.txt",w+))==NULL){
perror("fopen():");
exit(EXIT_FAILURE);
}

mode 参数
r 或 rb 以只读方式打开文件,文件必须存在。
r+ 或 r+b 以读写方式打开文件,文件必须存在。
w 或 wb 以只写方式打开文件,若文件存在则文件长度清0。若文件不存在z则创建。
w+ 或 w+b 以读写方式打开文件,若文件存在则文件长度清0。若文件不存在z则创建。
a 或 ab 以只写方式打开文件,若文件不存在则创建;向文件写入的数据被追加到文件末尾。
a+ 或 a+b 以读写方式打开文件。若文件不存在则创建;向文件写入的数据被追加到文件末尾。
*当给定b参数时,表示以二进制方式打开文件。(linux里忽略参数b)

关闭流fclose

int fclose(FILE *stream)
成功返回0;出错返回NULL,并设置errno
*流关闭时,会自动刷新缓冲区
*程序结束时,系统会自动关闭流并刷新缓冲区,但尽量手动close
*流关闭后,不能再对文件进行操作

读写流

fgetc/fputc一次读写一个字符
fgets/fgets一次读写一行
fread/fwrite

按字符读写


int fgetc(FILE *stream)等价int gets(FILE *stream)
成功时返回读取的字符;读到末尾或出错返回EOF。
int getchar(void)
getchar()等价fgetc(stdin)

fputc(int c,FILE *stream)等价puts(int c,FILE *stream)
成功时返回写入的字符;出错返回EOF。
putchar(int c)
putchar(c)等价fputc(c,stdout)

按行读写(


gets和fgets返回值是char *类型
char *gets(char *s)
小结:之前学c语言的时候,用到gets,当时只知道gets容易出错,所以尽量不用,学到这里发现gets函数是char 定义的,gets函数里chars相当于设立一个缓冲区,指针指向字符串首地址,由于参数里面没有设缓冲区大小,所以在写入字符串的时候字符串长度可能会超出缓冲区,导致缓存区溢出。
char *fgets(char *s,int size,FILE *stream)
成功时返回s;到文件末尾或者错误时返回NULL。
写入时遇到/n会在/n后加/0,数组最后一个位置也会是/0,也就是说写入一次只能写入size-1个字符,剩下没写入的可以在下次写入时继续


int puts(const char *s)
puts函数也是只设立缓冲区,没有向fputs一样设立写入的地方,所以puts默认写入stdout,也就是终端显示出来。(puts会追加\n)
int fputs(const char *s,FILE *stream)
成功时返回写入的字符串长度;出错时返回EOF。

文件I/O:

posix(可移植操作系统借口)定义的一组函数。
(不提供缓冲机制,每次读写操作都引起系统调用)
*核心概念是文件描述符
*linux里,标准IO基于文件IO实现

文件描述符

*文件描述符是一个非负整数。linux会自动给程序中每个打开的文件分配一个文件描述符。
*文件描述符从0开始分配。
*文件IO操作通过文件描述符完成。

打开/创建文件open

open函数用来创建或打开文件:
#include<fcntl.h>
int open (const char *path,int oflag,...);

*返回值是整型,成功时返回文件描述符;出错时返回EOF
*打开文件时使用两个参数
*创建文件时第三个参数指定新文件的权限
*只能打开设备文件

**int open(const char *pathname,int flags,mode_t mode)**;
pathname:被打开的文件名。(可包括路径名)
flags:打开文件方式

mode:
O_RDONLY:只读方式打开文件
O_WRONLY:可写方式打开文件
O_RDWR:读写方式打开文件
O_CREAT:如果文件不存在,就创建一个新的文件,并用第三个参数为其设置权限
O_EXCL:如果使用O_CREAT时文件存在,则可返回错误信息。这一参数可以测试文件是否存在
O_NOCTTY:使用本参数时,如文件为终端,那么终端不可以作为调用open()系统调用的那个进程的控制终端。
O_TRUNC:如文件已经存在,那么打开文件时先删除文件中原有数据。
O_APPEND:以添加方式打开文件,所以对文件的写操作都在文件的末尾进行。
mode:
被打开文件的存取权限,为8进制表示法。
(指定的权限和文件权限掩码的反进行的与操作是最终新建的权限)

关闭文件close

close函数用来关闭一个打开的文件:
#include<unistd.h>
int close(int fd);

*成功时返回0;失败时返回EOF
*程序结束时自动关闭所有打开的文件
*文件关闭后,文件描述符不再代表文件
*即使关闭不使用的文件,一个程序默认文件上线1024个

文件I/O -read

read函数用来从文件中读取数据:

#include<unistd.h>
ssize_t read (int fd,void *buf,size_t count);

size_t: unsigned int(long)
ssize_t:int(long)

(第二个参数是数据缓冲区,传进来一个缓冲区的首地址,缓冲区接受从fd文件中读取的内容,缓冲区需提前分配好,读取大小不能超出缓冲区)
*成功时返回实际读取的字节数;出错时返回EOF

文件I/O -write

write函数用来向文件写入数据:

#include<unistd.h>
ssize_t write(int fd,void *buf,size_t count);

*成功时返回实际写入的字节数;出错时返回EOF
*buf是发送数据的缓冲区
*count不应超过buf大小

文件I/O -lseek

lseek函数用来定位文件:

#include<unistd.h>
off_t lseek(int fd,off_t offset,int whence);

off_t偏移量
whence基准点
返回值:基准点+偏移量
*成功时返回当前文件读写位置;出错时返回EOF
*参数offset和参数whence同fseek完全一样

命令

diff 1 2 比较1和2内容
hexdump 查看物理文件的存储内容
hexdump -c 字符形式

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值