文件IO函数详解

1.标准IO

1.1 打开文件


     * FILE * fopen(const char *__restrict__ __filename, const char *__restrict__ __modes)
     * char *__restrict__ __filename:字符串表示要打开的文件
     * char *__restrict__ __modes:访问模式
    r:只读模式,文件不存在报错
            w:只写模式 如果文件存在清空文件,不存在就创建新文件
            a:只追加写模式 如果文件存在末尾追加写,不存在就创建新文件
            r+:读写模式 ,文件不存在报错
            w+:读写模式 如果文件存在清空文件,不存在就创建新文件
            a+:读追加写模式 如果文件存在末尾追加写,不存在就创建新文件
     * 返回值:FILE * 结构体指针 表示一个文件,报错返回NULL

1.2 关闭文件


     * int fclose (FILE *__stream)
     * FILE *__stream:需要关闭的文件
     * 返回值:成功返回0 失败返回EOF(负数) 通常关闭文件失败会直接报错

1.3 写字符


     * int fputc(int __c, FILE *__stream)
     * int __c:ASCII码对应的char
     * FILE *__stream:打开的一个文件
     * 返回值:成功返回的char 失败返回EOF

1.4 写字符串


     * int fputs(const char *__restrict__ __s, FILE *__restrict__ __stream)
     * char *__restrict__ __s:需要写入的字符串
     * FILE *__restrict__ __stream:需要写入的文件
     * 返回值:成功返回非负整数 失败返回EOF

1.5 写入格式化字符串


     * int fprintf(FILE *__restrict__ __stream, const char *__restrict__ __format, ...)
     * FILE *__restrict__ __stream:打开的文件
     * const char *__restrict__ __format:带格式化的长字符串
     * ...:可变参数,填入格式化的长字符串
     * 返回值:成功返回写入的字符个数 不包含换行符 失败返回-1

1.6 读取一个字节


     * int fgetc(FILE *__stream)
     * FILE *__stream:打开的文件
     * 返回值:读取到的一个字节 如果出错或到文件末尾返回EOF

1.7 读取字符串


     * char * fgets(char *__restrict__ __s, int __n,FILE *__restrict__ __stream)
     * char *__restrict__ __s:接收读取到的字符串
     * int __n:接收数据的长度
     * FILE *__restrict__ __stream:打开要读取的文件
     * 返回值:成功返回字符串 失败返回NULL

1.8 读取格式化的字符串


     * int fscanf(FILE *__restrict__ __stream,const char *__restrict__ __format, ...)
     * FILE *__restrict__ __stream:打开的文件
     * const char *__restrict__ __format:带有格式化的字符串(固定格式接收)
     * ...:可变参数,填写格式化的字符串(接收数据提前声明的变量)
     * 返回值:成功匹配到的参数的个数 如果匹配失败返回0 报错或文件结束EOF

1.9 标准输入/输出/错误


char *ch = malloc(10);
    //标准输入
    fgets(ch,10,stdin);
    printf("你好:%s\n",ch);

    //标准输出
    fputs(ch,stdout);
    printf("\n");

    //错误输出
    fputs(ch,stderr);
    printf("\n");
    return 0;
结果:
11111111111
你好:111111111     //标准输入
111111111    //标准输出
111111111    //错误输出
标准输出和错误输出的管道不同

2.系统调用


2.1 打开或创建文件


     * int open(const char *__file, int __oflag, ...)
     * char *__file:打开的文件
     * int __oflag:文件的模式
    O_RDONLY 只读模式
    O_WRONLY 只写模式
    O_RDWR   读写模式
    O_CREAT  如果不存在创建文件
    O_APPEND 追加写模式
    O_TRUNC  截断文件长度
     * ...可变参数:O_CREAT 创建文件的权限
     * 返回值:文件描述符 如果打开文件失败 返回-1 同时设置全局变量error表示对应的错误

2.2 系统调用用于读取已经打开的文件描述符


     * ssize_t read(int __fd, void *__buf, size_t __nbytes)
     * int __fd:文件描述符
     * void *__buf:存放数据
     * size_t __nbytes:读取数据的长度
     * 返回值:读取到数据的字节长度 成功大于0 失败-1

2.3 系统调用用于对打开的文件描述符写入内容


     * ssize_t write(int __fd, const void *__buf, size_t __n)
     * int __fd:模式选择 
    输入:STDIN_FILENO 0 
    输出:STDOUT_FILENO 1 
    错误:STDERR_FILENO 2 
     * const void *__buf:要写出的数据
     * size_t __n:写出的长度 通常获取到读的长度
     * 返回值:成功返回写出数据的长度 失败返回-1

2.4 用于在使用完成之后,关闭对文件描述符的引用


     * int close(int __fd);
     * int __fd:文件描述符
     * 返回值:成功返回0 失败返回-1

2.5 系统调用__exit()


     * 由POSIX标准定义的系统调用,用于立即终止一个进程,确保进程立即退出,不执行任何清理操作

2.6 终止当前进程


     * void exit(int status);
     * int status:父进程可接收到的退出状态码 0成功 非0错误
     * 清理操作: 调用所有通过atexit()注册的终止处理函数
             刷新所有标准I/O缓冲区(刷写缓存到文件)
             关闭所有打开的标准I/O流(比如通过fopen打开的文件)

3.示例代码

3.1 标准IO

#include <stdio.h>

int main(int argc, char const *argv[])
{
    FILE* filefd;
    int result;
    filefd = fopen("io_test.txt","r+");
    if(filefd == NULL){
        perror("fopen");
        return 1;
    }

    result = fputc('a',filefd);
    if(result == EOF){
        perror("fputc");
        return 1;
    }

    result = fputs("hello world",filefd);
    if(result == EOF){
        perror("fputs");
        return 1;
    }

    char *str = "789";
    int count = 1;
    result = fprintf(filefd,"%s %d",str,count);
    if(result < 0){
        perror("fprintf");
        return 1;
    }
    
    // 将光标移至文件前
    fseek(filefd, 0, SEEK_SET);
    
    char c;
    c = fgetc(filefd);
    printf("%c\n",c);


    char recv_buf[1024];
    char *res;
    res = fgets(recv_buf,sizeof(recv_buf),filefd);
    printf("%s\n",res);

    fseek(filefd, 0, SEEK_SET);
    
    char sul[20];
    int rs;
    rs = fscanf(filefd,"%s",sul);
    if(rs == EOF){
        perror("fscanf");
        return 1;
    }else{
        printf("%s",sul);
    }

    result = fclose(filefd);
    if(result != 0){
        perror("fclose");
        return 1;
    }

    return 0;
}

3.2 运行结果

3.3 系统调用

#include <stdio.h>
#include <fcntl.h>
#include <sys/stat.h>
#include <sys/types.h>
#include <unistd.h>
#include <stdlib.h>
#include <string.h>

int main(int argc, char const *argv[])
{   
    int fd;
    fd = open("file_text.txt",O_CREAT | O_RDWR,0666);
    if(fd < 0){
        perror("open");
        return 1;
    }

    char *str = "hello bro\n";
    int len = strlen(str);
    
    write(fd,str,len); // 写入文件
    write(STDIN_FILENO,str,len); //标准输入
    
    char buf[1024];
    ssize_t wlen;
    if(wlen = read(fd,buf,sizeof(buf)) > 0){
        write(STDOUT_FILENO,buf,wlen); //标准输出
    }

    close(fd);

    return 0;
}

3.4 运行结果

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值