标准IO文件操作

标准IO:C语言库函数IO(文件)

库函数进行IO(输入输出、或读写操作)说明<stdio.h>

提供通用接口

库函数:

1、打开文件fopen函数

 #include <stdio.h>
//打开一个对应字符串表示名字的文件(对应文件名的文件)
       FILE *fopen(const char *pathname, const char *mode);
//参数:
//  参数1:
//const char *pathname:字符串的首地址、要打开的文件名
//  参数2:
//const char *mode:字符串首地址、用参数表示打开方式、存储打开的方式
//打开文件的方式
//  r(read):读   w(write):写  a(append):追加    t(text):文本  b(binary):二进制文件(如果没有添加默认为t表示文本方式打开)
//  +:扩展权限
//  打开权限由上述字符构成、也就是可以使用多种权限
//  r:只读,打开文件的开始位置,文件必须存在
//  w:只写,如果文件存在则清空文件,不存在则创建文件
//  a:追加,在文件末尾添加内容,不存在则创建文件
//  r+:读写,文件必须存在
//  w+:读写,文件存在则清空、不存在则创建文件
//  a+:读写,文件末尾追加、不存在则创建文件
//读写中,缺少哪个权限就+上对应权限
/*
文件信息结构体FILE
打开文件函数调用时内核会申请一段空间,存放文件的相关信息内容,这些内容都会被保存到一个结构体变量中,该结构体类型有系统进行声明定义,就是FILE
用FILE *来描述,FILE *叫做文件流指针
流:
    所有的IO操作都是简单的移动,从程序移出或移进
*/
//返回值:
//FILE * 返回文件信息结构体的地址,要操作的文件是哪一个
//成功返回文件流指针
//失败返回NULL,同时自动设置错误码
​
​例子:
#include <stdio.h>
#include <errno.h>
int main()
{
    FILE *fp = fopen("1.txt","r+");
    if(fp==NULL)
    {
        perror("fopen error");
    }
}

2、打印错误码

//打印错误码
#include <stdio.h>
#include <errno.h>
//打印当前的错误码
void perror(const char *s);
//参数:const char *s打印错误提示信息的字符串调用perror函数就输出s的内容

3、关闭文件

#include <stdio.h>
//关闭指定文件
int fclose(FILE *stream);
//参数:FILE *stream  文件流指针,关闭对应的文件
//返回值 int
//返回0则是success,返回EOF则失败且设置错误码
//EOF相当于 #define EOF -1

​例子
#include <stdio.h>
#include <errno.h>
​
int main()
{
    FILE *fp = fopen("1.txt","r+");
    if(fp==NULL)
    {
        perror("fopen error");
        return -1;
    }
    if(fclose(fp))
    {
        perror("flcose error");
        return -1;
    }
    return 0;
}

4、输入输出(读写文件内容)

1、fprintf——输出到文件(写文件)格式化写

#include <stdio.h>
​
int printf(const char *format, ...);
int fprintf(FILE *stream, const char *format, ...);//把format字符串输出到指定文件中
/*
参数
    参数1 FILE *stream:文件流指针,输出到对应的文件
    参数2 const char *format:输出的字符串,字符串中包含可替换字符(%s%d%f)例如
    fprintf(fp,“%d%s%f”,10,"dsaha",1.2);
    
返回值
    int
    成功返回输出的字符个数
    失败返错误值就是负数
*/
​
​例子:
#include <stdio.h>
#include <errno.h>
​
int main()
{
    FILE *fp = fopen("1.txt","w+");
    if(fp==NULL)
    {
        perror("fopen error");
        return -1;
    }
    int num = fprintf(fp,"%s","hello world");
    printf("%d\n",num);
    num = fprintf(fp,"a = %d,b = %f,c = %c\n",10,1.2,'a');
    printf("%d\n",num);
    if(fclose(fp))
    {
        perror("flcose error");
        return -1;
    }
    return 0;
}

2、fscanf——从外部输入到程序(读文件)格式化读

#include <stdio.h>
//读取文件内容,与format数据匹配
int scanf(const char *format, ...);
int fscanf(FILE *stream, const char *format, ...);
/*
返回值
    int
    成功  返回匹配字符的个数
    失败  EOF
*/

例子

#include <stdio.h>

​
int main()
{
    //以只读打开2.txt
    FILE *fp = fopen("2.txt","r");
    if(fp==NULL)
    {
        perror("fopen error");
        return -1;
    }
    
    //读取2.txt的第一个整数给a;
    int a;
    fscanf(fp,"%d",&a);
    printf("%d\n",a);
    
    //多次读取是从上一次读取结束的位置开始匹配
    fscanf(fp,"%d",&a);
    printf("%d\n",a);
    
    //关闭访问的文件
    if(fclose(fp))
    {
        perror("flcose error");
        return -1;
    }
    return 0;
}
 

3、单个字符读写

#include <stdio.h>
//从文件中读取一个字符,输入到程序中
int fgetc(FILE *stream);
/*
参数
    FILE *stream    文件流指针,从指定文件读取一个字符
返回值
    int
    成功  把读取到的字符以返回值的形式输入到程序中,并且转换成int类型
    失败  EOF
*/
​
#include <stdio.h>
​
int main()
{
    FILE *fp=fopen("1.txt","r+");
    char buf[11];
    for(int i=0;i<10;i++)
    {
        int c=fgetc(fp);
        if(c==EOF)
        {
            if(feof(fp)!=0)
            {
                printf("is end of file\n");
                return 0;
            }
            else
            {
                printf("get error\n");
                return -1;
            }
        }
        buf[i]=c;  
    }
}
int feof(FILE *stream);
/*测试是否到末尾,如果返回非0,就是到文件末尾*/
int ferror(FILE *stream);
​
#include <stdio.h>
//从程序中读取一个字符写入文件
int fputc(int c, FILE *stream);
/*
    参数
        int c   整数,对应ASCII码的字符,要写入的字符
        FILE *stream    对应的文件
    返回值
        int
        成功  返回写入的字符的ASCII码即参数c
        失败  返回EOF
*/
​
#include <stdio.h>
​
int main()
{
    FILE *fp1 = fopen("1.txt","r");
    FILE *fp2 = fopen("test.txt","w");
    int c;
    while(1)
    {
        
         c = fgetc(fp1);
        if(c==EOF)
        {
             if(feof(fp1)!=0)
            {
                printf("copy flie ok!\n");
                break;
            }
            return -1;
        }
        fputc(c,fp2);
    }
    fclose(fp1);
    fclose(fp2);
}
​

4、多个字符读写

//一次读取多个字符,一次最大读取size-1个字符
/*
Fgets()从流中最多读取一个小于size的字符并存储
读入由s指向的缓冲区。读入在EOF或换行符之后停止。
如果读取换行符,则将其存储到缓冲区中。终止的空字节
('\0')存储在缓冲区的最后一个字符之后。
*/
char *fgets(char *s, int size, FILE *stream)
 /*
 参数
    char *s 字符指针,读取内容存放的地址,需要有对应的存储空间,字符数组首地址
    int size 读取的大小,最大读取size-1,有中止
    FILE *stream 读取的文件名
    
 使用feof/ferror判断
 */
#include <stdio.h>
​//fgets使用
int main()
{
    FILE *fp=fopen("1.txt","r");
    char buf[20];
    fgets(buf,20,fp);
    
    printf("%s",buf);
    fclose(fp);
}
#include <stdio.h>
//将程序内容输入到文件
//Fputs()将字符串s写入流,不包含终止的空字节('\0')。
int fputs(const char *s, FILE *stream);
/*
    参数
        const char *s 字符指针,字符串首地址,要写入到文件的字符串首地址
        FILE *stream 操作对应的文件
    返回值
        int 
        成功 返回正数
        失败 返回EOF
*/
​
#include <stdio.h>
​//fputs使用
int main()
{
    FILE *fp2=fopen("2.txt","w");
    if(fputs("hello world",fp2)==EOF)
    {
        printf("error\n");
    }
    char buf1[]="hello\0 world";
    fputs(buf1,fp2);
    fclose(fp);
}

5、指定大小输入输出

 #include <stdio.h>
//读取指定大小的文件内容,插入到程序中,大小就是数据个数乘字节大小
/*
函数fread()从对象中读取nmemb数据项,每个数据项的大小为字节
流指向的流,将它们存储在ptr指定的位置。
函数fwrite()将nmemb数据项(每个长度为字节)写入到
流指向的流,从ptr给出的位置获取它们。
*/
size_t fread(void *ptr, size_t size, size_t nmemb, FILE *stream);
​
/*
    参数
        void *ptr 读取数据存储的位置
        size_t size 每个数据的大小
        size_t nmemb 读取数据的个数
        FILE *stream 操作的文件
    返回值
        int
        成功 返回读取的数据个数(返回值不一定要与读取数据的个数相同)
        这次没有读取到数据,就表示上一次已经读到文件末尾,返回0
        
*/
//写入指定大小的程序内容到文件,从程序输出数据到文件,大小就是数据个数乘字节大小
size_t fwrite(const void *ptr, size_t size, size_t nmemb,FILE *stream);
/*
    参数
        const void *ptr 存储数据的首地址
        size_t size 每个数据大小
        size_t nmemb 数据个数
        FILE *stream 操作的文件
    返回值
        成功 返回写了多少数据
*/
​
#include <stdio.h>
​//fread使用
int main()
{
    FILE *fp=fopen("1.c","r");
    char buf[20];
    fread(buf,1,20,fp);
    printf("%s",buf);
}
#include <stdio.h>
​//fwrite使用
int main()
{
    FILE *fp=fopen("test.txt","w");
   /* char buf[20]={0};
    scanf("%s",buf);*/
    int data[5]={1,2,3,4,5};
    
    fwrite(data,4,5,fp);
}
#include <stdio.h>
​
int main()
{
    FILE *fp=fopen("test.txt","r");
    int data[5];
    
    int a = fread(data,4,5,fp);
    printf("%d\n",a);
    for(int i=0;i<5;i++)
    {
        printf("%d ",data[i]);
    }
    printf("\n");
    
}

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值