#系统编程#

一、文件IO

应用层内核层物理层

<1>应用层:只写逻辑代码

<2>内核层:接到应用层的指令,操作硬件

<3>物理层:根据内核层的需求去操作硬件

1.1、什么是IO

I就是input,O就是output,是指对内存的输入和输出,内存:速度快,数据掉电就丢失,贵;

外存(硬盘):速度慢,数据永久保存,掉电不丢失,便宜

1.2、如何使用IO

打开文件---读写文件---关闭文件

1.3、IO的分类

<1>文件IO:由系统提供的API接口,也被称为系统调用,每个系统的API接口都不一样,也就造成liunx系统下的执行文件移植到其他平台的话不能使用,因为接口不一致。

<2>标准IO:stdio.h---也称为标准c库函数,标准IO是在文件IO的基础上封装出来的。

1.4、常用的文件IO接口

<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:读写权限打开

           mode:附加参数

                O_APPEND:以追加写的方式打开文件
                O_CREAT:如果文件存在则打开文件,如果文件不存在,则创建文件,如果使用这个参                 数,需要使用open的第三个参数。
                O_EXCL:如果文件存在则报错返回
                O_NONBLOCK:以非阻塞方式打开一个文件
                O_TRUNC:以清空的方式打开文件

           返回值:成功返回一个文件描述符

                         失败返回-1

<2>read

#include <unistd.h>

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

        功能:对一个文件进行读取
        参数:
                fd : 目标文件描述符 -- 》对哪个文件进行读取
                buf:存放读取到的数据 -- 》读取到的数据存放的地址
                count:读多少
        返回值:  成功 : 返回成功读到的字节个数
                      失败: - 1
                      读到文件末尾返回0

<3>write

#include <unistd.h>

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

        功能:对一个文件进行写入操作
        参数:
                fd : 目标文件描述符 -- 》对哪个文件进行读取
                buf:要写入数据的地址 -- 》写入的具体数据
                count:写入数据的大小 -- 》写多少,以字节为单位
        返回值:  成功 : 返回成功写入的字节个数
                      失败: - 1

<4>lseek

#include <sys/types.h>

#include <unistd.h>

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

        功能:操作读写指针,对读写指针进行偏移
        参数:
                fd : 目标文件描述符
                offset:如何偏移,偏移多少
                                如果该数为负数,代表向前进行偏移,如果偏移除了文件的开头,报错返回
                                如果该数为正数,代表向后偏移,如果偏移出了文件末尾,用‘\0’来填充,那么此类文件被称为空洞文件
注意:如果偏移偏移后没有对其进行任何写入操作,内核认为该偏移无效,不会扩大文件大小。
                whence:基准位置 -- 》根据某一个位置进行偏移
                                SEEK_SET:根据文件开头进行偏移
                                SEEK_CUR:根据用户当前位置进行偏移
                                SEEK_END:根据文件末尾进行偏移
        返回值:
                成功返回偏移的字节个数(根据文件开头为基准进行计算的)
                失败返回 - 1

二、标准IO

标准IO就是标准C库函数提供额API接口,是在文件IO的基础上封装出来的,并且,标准IO在文件IO的基础上封装出一个叫缓冲区的东西,用来存放一些不是很着急的数据,等到缓冲区满,再调用一次文件IO完成写入或者读取工作。
果有些数据特别着急的,比如:下发的命令,实时监测的数据,必须使用文件IO

2.1、fopen

#include <stdio.h>
FILE *fopen(const char *pathname, const char *mode);

参数:
    pathname:要打开的文件的路径
    mode:打开文件的方式
       r:以只读的方式打开一个文件,文件必须存在    
       r+:以读写的方式打开一个文件,文件必须存在
       w :如果文件存在则清空写入,如果文件不存在则创建写入
       w+:如果文件存在则清空读写,如果文件不存在则创建读写
       a :如果文件存在则追加写入,如果文件不存在则创建写入    
       a+:如果文件存在则追加写入和读取,读取时从文件开头开始读取,写入时从文件末尾开始写入,lseek偏移后不能进行写入操作。
 注意:有可能以后会遇到二进制文件 rb+,b:执行二进制操作,linux下无区分
返回值:
    成功会返回一个文件流指针
    失败返回NULL

2.2、fgetc

#include <stdio.h>
int fgetc(FILE *stream);

功能:从指定文件流指针中获取一个字符
参数:
    stream:目标文件流指针
返回值:
    成功会返回字符所对应的ascii
    失败返回EOF
    到达文件末尾:EOF

2.3、feof

#include <stdio.h>
int feof(FILE *stream);

功能:判断是否到达了文件末尾
参数:
    stream:目标文件流指针
返回值:
    如果到达文件的末尾会返回一个非0值
    其它情况返回0

2.4、ferror

#include <stdio.h>
int ferror(FILE *stream);

功能:判断文件操作是否出错
参数:
    stream:目标文件流指针
返回值:
    如果文件操作失败,会返回一个非0值
    其它情况返回0

2.5、fputc

#include <stdio.h>
int fputc(int c, FILE *stream);

功能:向指定的一个文件输出一个字符
参数:
    c:想要写入的字符,将int转换成unsigned char类型的数据昔日如
    stream:目标文件流指针
返回值:
    成功:会返回字符所对应的ascii
    失败返回EOF

2.6、fgets

#include <stdio.h>
char *fgets(char *s, int size, FILE *stream);

功能:从指定文件获取一行字符(行读取)
参数:
    s:读取的字节个数
    size:读取的字节大小
    stream:目标文件流指针
返回值:
    成功:读到的字符串的首地址
    失败:返回NULL
    读到文件的末尾:返回NULL

2.7,fputs

#include <stdio.h>
int fputs(const char *s, FILE *stream);

功能:向一个文件进行字符串的输出
参数:
    s:=想要写入数据的地址
    stream:目标文件流指针
返回值:
    成功:返回一个非负数
    失败:返回EOF(-1)

2.8、fread

#include <stdio.h>
size_t fread(void *ptr, size_t size, size_t nmemb, FILE *stream);

功能:二进制读取文件
参数:
    ptr:存放读到的数据的地址
    size:对象的大小
    nmemb:对象的个数
    注意:总的读取的字节个数 = 对象的大小 * 对象的个数
    stream:目标文件流指针
返回值:
    返回值:成功返回读到对象的个数
    失败返回:0

2.9、fweite

#include <stdio.h>
size_t fwrite(const void *ptr, size_t size, size_t nmemb,FILE *stream);

功能:二进制写入文件
参数:
    ptr:想要写入的数据的首地址
    size:对象的大小
    nmemb:对象的个数
    stream:目标文件流指针
返回值:
    返回值:成功返回写入对象的大小
    失败返回:返回一个小的对象的个数

2.10、fseek

#include <stdio.h>
int fseek ( FILE * stream , long offset , int whence );
功能:
        功能:操作读写指针,对读写指针进行偏移
参数:
        stream : 目标文件流指针
        offset:如何偏移,偏移多少
                如果该数为负数,代表向前进行偏移,如果偏移除了文件的开头,报错返回
                如果该数为正数,代表向后偏移,如果偏移出了文件末尾,用‘\0’来填充,那么此类文件被称为空洞文件
                注意:如果偏移偏移后没有对其进行任何写入操作,内核认为该偏移无效,不会扩大文件大小。
        whence:基准位置 -- 》根据某一个位置进行偏移
                SEEK_SET:根据文件开头进行偏移
                SEEK_CUR:根据用户当前位置进行偏移
                SEEK_END:根据文件末尾进行偏移
返回值:
        成功返回 0
        失败返回 - 1
2.11、sprintf
#include <stdio.h>
int sprintf ( char * str , const char * format , ...);
功能:向一个固定的地址输入一个字符串(一般用于字符串的拼接)
参数:
        str : 要存放字符串的首地址
        format : 格式化字符串
... :可变参数(一般放置变量)
返回值:
        成功返回输出的字节个数
        失败返回负数
2.12、snprintf
#include <stdio.h>
int snprintf ( char * str , size_t size , const char * format , ...);
功能:向一个固定的地址输入固定大小的字符串
参数:
        str : 要存放字符串的首地址
        size:大小(规定写入 str 中字符串的大小)
        format : 格式化字符串
        ... :可变参数(一般放置变量)
返回值:
        成功返回输出的字节个数
        失败返回负数
2.13、fprintf
#include <stdio.h>
int fprintf(FILE *stream, const char *format, ...);
功能:向一个固定的地址输入固定大小的字符串
参数:
        stream:目标文件流指针
        format:格式化字符串
        ...:可变参数(一般放置变量)
返回值:
        成功返回输出的字节个数
        失败返回负数
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值