Linux软件编程(3)—标准IO(2)文件IO(1)

一、标准IO

1.函数接口补充
(1)fwrite

原型:size_t fwrite(const void *ptr, size_t size, size_t nmemb, FILE
*stream);
功能:
向流中写入ptr指向的nmemb个对象,每个对象size个字节
参数:
ptr:指向数据空间的首地址
size:写入的每个对象的大小
nmemb:写入对象的个数
stream:文件流指针
返回值:
成功返回实际写入对象的个数
失败返回0

(2)fread

原型:size_t fread(void *ptr, size_t size, size_t nmemb, FILE
*stream);
功能:
从流中读取nmemb个对象到ptr指向的空间中,每个对象size个字节
参数:
ptr:存放数据空间的首地址
size:读取对象的字节大小
memb:读取对象的个数
stream:文件流指针
返回值:
成功返回读到对象的个数
失败或者读到文件末尾返

e.g.图片拷贝

思路:利用fread和fwrite实现图片的拷贝

#include <stdio.h>

int main(void)
{
    FILE *fp1 = NULL;
    FILE *fp2 = NULL;
    size_t nret = 0;
    char tmpbuff[4096] = {0};

    fp1 = fopen("jake.jpg", "r");
    if(NULL == fp1)
    {
        perror("fail to fopen");
        return -1;
    }
    fp2 = fopen("jaeyun.jpg", "w");
    if(NULL == fp2)
    {
        perror("fail to fopen");
        return -1;
    }

    while(1)
    {
    //  nret = fread(tmpbuff, sizeof(tmpbuff), 1, fp1); //每次读4096个字节,读一个对象,最后如果不满4096则会导致文件缺失
        nret = fread(tmpbuff, 1, sizeof(tmpbuff),fp1);//每次读一个字节,每次最多读4096个对象,避免缺失
        if(0 == nret)
        {
            break;
        }
        fwrite(tmpbuff, 1, nret, fp2);
    }

    fclose(fp1);
    fclose(fp2);

    return 0;
}
2.流的定位:设置流的偏移量
(1)fseek

原型:int fseek(FILE *stream, long offset, int whence);
功能:
设置流的偏移量的标识
参数:
stream:文件流指针
offset:偏移量
> 0 向后偏移
< 0 向前偏移
whence:标识
SEEK_SET 文件开头
SEEK_CUR 当前位置
SEEK_END 文件末尾
返回值:
成功返回0 失败返回-1

(2)ftell

原型:long ftell(FILE *stream);
功能:
获得流的偏移量
参数:
stream:文件流指针
返回值:
成功返回流的偏移

(3)rewind

原型:void rewind(FILE *stream);
功能:
将流重新定位到开

e.g.从bmp文件中读取图片的宽度和高度

思路:bmp格式的宽和高是在文件第18个字节后的8个字节存储的(分别四个字节),通过设置流的偏移量来读取数值

#include <stdio.h>

int main(void)
{
    FILE *fp = NULL;
    int width = 0;
    int height = 0;

    fp = fopen("1.bmp", "r");
    if(NULL == fp)
    {
        perror("fail to fopen");
        return -1;
    }

    fseek(fp, 18, SEEK_SET);
    fread(&width, sizeof(width), 1, fp);
    fread(&height, sizeof(height), 1, fp);

    fclose(fp);

    printf("宽为%d,高为%d\n", width, height);
    
    return 0;
}

二、文件IO

1.概念

(1)标准IO是有缓存的IO,文件IO没有缓存,适合于通信、硬件设备操作

(2)标准IO是库函数,文件IO是系统调用

(3)系统调用:是Linux内核中的代码,只能在Linux系统中使用

(4)库函数:是对系统调用的封装,可以在不同的操作系统中安装并使用,库函数最终还是要调用系统调用完成对应功能

2.文件IO函数接口
(1)文件打开

原型:
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 文件存在截断为0(清0)
O_APPEND 追加
O_EXCL 文件存在报错
返回值:
成功返回新文件描述符
失败返回-1

注意:

有三个特殊的文件描述符:标准输入(0)、标准输出(1)、标准错误(2)

文件描述符特点:①非负整数 ②取尚未被占用的最小的非负整数

文件描述符是有上限的,到达上限后再打开会报错误

(2)关闭文件描述符

原型:int close(int fd);
功能:
关闭文件描述

(3)请写出标准IO对应的文件IO的打开方式
标准IO 文件IO
rO_RDONLY
r+O_RDWR
wO_WRONLY | O_CREAT | O_TRUNC , 0664
w+O_RDWR | O_CREAT | O_TRUNC, 0664
O_WRONLY | O_APPEND | O_CREAT, 0664
a+   O_RDWR | O_APPEND | O_CREAT, 066

           
                   
                     
                      
                   
                    
               

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值