标准IO与文件IO

目录

标准IO与文件IO

文件分类

基本分类

linux文件的操作

标准IO

文件打开操作

读取文件操作

int fgetc(FILE *stream)

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

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

写入文件

关闭----fclose()

使用相关函数复制任意大小的文件(包括图片)


标准IO与文件IO

IO就是针对文件的输入与输出

文件分类

基本分类

1、文本文件(ASCII码文件),文件中的内容是用ASCII码或者字符来显示的
2、二进制文件:文件当中存放的内容是二进制数据。
    两个文件在物理存储上没有差别(对于计算机来说都是二进制方式处理),逻辑有差别(文件的编码方式不同)
    linux系统文件分类:
        普通文件:-
        目录文件:d
        管道文件:p
        套接字文件:s
        链接文件:l
        块设备文件:b
        字符设备文件:c

linux文件的操作

标准IO

标准IO是由ANSI c标准提供的c语言标准函数库
    文件流:指数据像水流一样,所有的I/O操作仅是简单的从程序进或移除,这种字节流(比特流),就称为流。
    FILE* 是指文件指针类型,在类型指向是一个结构体,该结构体描述了文件相关信息,每一个应用程序会默认定义三个文件流指针:stdio stdout、stderr
    stdin:标准输入流
    stdout:标准输出流
    stderr:标准错误流
man手册:
    man 1:查看shell命令
    man 2:查看系统调用
    man 3:查看c标准库
​

文件打开操作

1、打开 -- fopen
FILE *fopen(const char *path, const char *mode);
path:表示文件路劲字符串
mode:打开文件的方式
    ”r“:只读打开,不会创建文件、文件流指针默认指向开头
    ”r+“:读写打开,不会创建文件、文件流指针默认指向开头
    “w”:只写打开,会创建文件(文件不存在时)或清空文件(文件存在),文件流指针默认指向开头
    “w+”:读写打开,会创建文件(文件不存在时)或清空文件(文件存在),文件流指针默认指向开头
    “a”:只写打开,会创建文件(文件不存在时)或追加内容(文件存在)。
    “a+”:读写打开,会创建文件(文件不存在时)或追加内容(文件存在)。
    ”b“:以二进制流方式,需要与前六个方式组合使用
返回值:
    NULL:表示错误返回
    正确返回文件指针流:该指针可以认为指向一个文件(path路径文件),因此利用该指针就可以间接操作文件。

读取文件操作

int fgetc(FILE *stream)

int fgetc(FILE *stream)
​
从指定文件中读取一个字符, 并且将字符返回. 
 stream: 返回值: 
 EOF:文件末尾 或 错误 
 正确返回当前读取的字符
 
​

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

char *fgets(char *s, int size, FILE *stream);//从指定文件读取一行,因为遇到‘\n’结束
​
意义: 从指定文件中读取一行数据. 当遇到'\n'表示一行读取结束. 
​
1.当size的值小于等于文件中一行数据的个数时, 读取的实际字符数是size-1,最后会默 认加一个'\0'
2.当size-1的值 大于 文件中一行数据的个数时,遇到'\n'正常结束. 并且读取到的内容 包含'\n' 
3.两种情况都必须以'\0'为结束标志. 
​
s: 数据首地址 
size: 想要读取一行文件内容的字节数 
stream: 文件流指针 
返回值: NULL: 错误返回 
正确返回数据首地址.
​

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

size_t fread(void *ptr, size_t size, size_t nmemb, FILE *stream); 
​
意义:按照指定的个数对文件进行数据读取.(这里的个数不是指字节数..) 
​
ptr: 数据首地址,可以为任意指针类型. 
​
size: 一个数据的字节大小 例子: 读取整数数据的话 size = sizeof(int) 
​
nmemb: 想要读取的数据个数. 
​
stream: 文件流指针 
​
返回值: 
​
错误 或 文件末尾: 0 或 比nmemb小的数字 
​
正确返回成功读取到的数据个数. 
​
​
因为fread函数不作错误返回还是结尾返回,如果要知道原因需要调用函数
判断出错或者是文件末尾可以使用以下函数(只有fread函数需要,只有读取需要判断): 
feof(): 判断是否到达文件末尾. 用法: if(foef(fp) != 0) ferror()://非零表示结尾退出
判断文件操作是否出错. 用法: if(ferror(fp) != 0)// 非零表示错误退出
​

写入文件

int fputc(int ch, FILE *stream):向文件写入一个字符. 
int fputs(const char *s, FILE *stream): 向文件写入一串数据. s表示数据的首地址. 
size_t fwrite(const void *ptr, size_t size, size_t nmemb, FILE *stream); 
 
 返回值: 错误: 0 或 比nmemb小的数字 
 正确返回成功写入的数据个数. 

关闭----fclose()

int fclose(FILE *stream);
成功返回 0
失败返回    EOF
​
​

使用相关函数复制任意大小的文件(包括图片)

#include <stdio.h>
#include<stdlib.h>
#include<string.h>
​
int main(int argc, char *argv[])
{ 
    FILE* fd1 = NULL;
    FILE* fd2 = NULL;
    char buf[13] = {0}  ;
    int ret;
    fd1 = fopen("./jp.jpg","rb");
    if(NULL == fd1)
    {   
        printf("open demo1 failed\n");
        return -1; 
    }   
​
    fd2 = fopen("fread3.jpg","wb");//打开、创建一个新文件
    if(NULL == fd2)
    {   
        printf("open failed\n");
        return -1; 
    }   
​
    while(1)
    {   
        ret = fread(buf,1,1,fd1);//读取文件到buf
        if(0 == ret)
        {
            if(ferror(fd1) != 0)
            {
                printf("fread failed\n");
                return -1; 
            }else
            {
                printf("end of file\n");
                break;
            }
        }
        ret = fwrite(buf,1,1,fd2);
        {
            if(ret == 0 ) 
            {
                return -1; 
            }
        }
        memset(buf,0,sizeof(buf));
    }   
    fclose(fd1);
    fclose(fd2);
    return 0;
} 
~     

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值