标准IO进程线程函数:fopen,perror,fclose,fprintf,fscanf,fputc,fgetc,缓冲区,fputs,fgets,fwrite,fread,fseek,ftell,

标准IO函数:

1.流指针(FILE*):

FILE* fp=fopen("1.txt","r"):这个fp就是一个流指针,当以只读方式打开这个文件时,同时会申请一片缓冲区,这时流指针fp会包含文件当前读取位置的信息,如果是可读可写方式还会包含缓冲区里等待读取或写入的数据的信息,还会包含文件是否结束和是否发生错误信息。

FILE结构体:

struct _IO_FILE{

char* _IO_buf_base;缓冲区起始地址

char*_IO_buf_end;缓冲区结尾地址

int _filen0;文件描述符

}

缓冲区大小:尾地址-首地址

标准流指针:

标准输入流指针:FILE* stdin

标准输出流指针:FILE* stdout

标准错误输出流指针:FILE* stderr

这三个指针都对应着终端文件,stdin流指针用来从终端获取数据,stdout和stderr用来将数据输出到终端。stdout是行缓冲,有1024byte的缓冲区,而stderr是无缓冲,只有1byte的缓冲区,来一个输出一个。stderr打印实时性高,一般用于打印错误信息,防止错误信息无法读取。scanf,gets,getchar函数默认封装stdin流指针,printf,putchar,puts函数默认封装stdout流指针。

标准IO函数:

1.fopen(FILE *fopen(const char *pathname,const char *mode);)

功能:用来打开一个文件,成功返回FILE*类型指针,失败返回NULL,更新errno。

例如:FILE* fp=fopen("1.txt","r");打开一个名为1.txt的文件,以只读的方式。参数列表第一个填要打开的文件路径及名字,第二个填的是打开方式。

打开方式有:

"r":以读的方式,从头读取,无文件则打开失败。

"r+":以读和写的方式,从头开始读写取,无文件打开失败。

"w":以写的方式打开文件从头开始写取,如果没有文件则创建文件并打开,有文件则清空文件并打开。

"w+":以读写的方式打开文件从头开始读写取,如果没有文件则创建并打开,有文件则清空文件并打开。

"a":以写的方式打开文件,从结尾开始写取。如果文件不存在则创建一个文件,有文件则文件流从结尾开始,不会清空原先内容。

"a+":以读写方式打开文件,文件流在开头。读文件时从开头开始读取,写文件时从文件结尾开始写。

2.perror(void perror(const char *s);)

功能:根据errno,打印错误信息。参数列表填入提示字符串。例如:输出文件打开时失败信息:perror("fopen:");

3.fclose(int fclose(FILE *stream);)

功能:关闭指定文件,释放资源(如缓冲区)。成功返回0,失败返回EOF(-1),更新errno。

例如:FILE*fp=("1.txt","r");fclose(fp);

4.fprintf(int fprintf(FILE *stream,const char *format,...);)

功能:将数据格式化输出到指定文件。

例如:a[]="abcd";fprintf(fp,"%s",a);将字符串abcd输出到流指针fp指向的文件中。

成功返回被打印字符个数,失败返回负数。

5.fscanf(int fscanf(FILE *stream,const char *format,...);)

功能:从文件格式化读取数据,不识别空格,换行。成功返回读取数据个数,读完或者运行失败返回EOF(-1)。例如:char a[20]="";fscanf(fp,"%s",a);将文件里的空格或换行前的字符串赋值进字符串a中。当参数是"%c"时读取空格。读取时文件偏移量会改变。

用fscanf和fprintf实现文件拷贝:

    FILE *fp=fopen("2.c","r");
    if(NULL==fp)
    {
        ERR_MSG("fopen");
        return -1;
    }
    FILE *fq=fopen("1.txt","w");
    if(NULL==fq)
    {   
        ERR_MSG("fopen");
        return -1;                                                                                                   
    } 
    char c;
    int res;
    while((res=fscanf(fp,"%c",&c)!=EOF))//用fscanf和fprintf进行拷贝
    {
        printf("%c",c);
        fprintf(fq,"%c",c);
    }                                                                                                                  
    if(fclose(fp)<0)
    {
        ERR_MSG("fclose");
        return -1;
    }
    printf("关闭成功\n");
    if(fclose(fq)<0)
    {
        ERR_MSG("fclose");
        return -1;
    }
    printf("关闭成功\n");


6.fputc(int fuptc(int c,FILE *stream);)

功能:将单字符打印到指定文件中。成功返回字符的整型形式,失败返回EOF(-1)。例如:fputc('a',fp);

或者fputc(97,fp);

7.fgetc(int fgetc(FILE *stream);)

功能:从指定文件读取单个字符。成功返回对应的整型形式,失败返回EOF(-1)。例如:fgetc(fp);从流指针fp指向的文件中提取一个单字符,偏移一个单字符大小的流。

用fputc和fgetc实现文件拷贝:

    FILE *fp=fopen("2.c","r");
    if(NULL==fp)
    {
        ERR_MSG("fopen");
        return -1;
    }
    FILE *fq=fopen("1.txt","w");
    if(NULL==fq)
    {   
        ERR_MSG("fopen");
        return -1;                                                                                                   
    } 
    char c;
    while((c=fgetc(fp))!=EOF)//用fgetc和fputc进行拷贝
    {
        printf("%c",c);
        fputc(c,fq);
    }
    if(fclose(fp)<0)
    {
        ERR_MSG("fclose");
        return -1;
    }
    printf("关闭成功\n");
    if(fclose(fq)<0)
    {
        ERR_MSG("fclose");
        return -1;
    }
    printf("关闭成功\n");

8.缓冲区

标准IO才有缓冲区,所有数据先放入缓冲区,只有缓冲区满或者满足一定条件才会刷新缓冲区。

全缓冲:大小4k,手动fopen打开文件后,创建的就是全缓冲区。刷新条件:1.缓冲区满。2.fflush函数,强制刷新输出流缓冲区。3.关闭流指针。4.主函数调用return。5.调用exit函数退出程序。6.输入输出转换。

行缓冲:大小1k。刷新条件与全缓冲类似,遇到\n时也刷新。

无缓冲:大小1byte,直接刷新,不需要刷新条件。

9.fputs(int fputs(const char *s,FILE *stream))

功能:将字符串输出到指定文件中,不会补充\n。成功返回非负数,失败返回EOF。不补充不代表不识别。

 10.fgets(char *fgets(char *s,int size,FILE *stream))

功能:从指定文件中获取字符串。最多获取size-1个字符,因为函数停止读取后要留一个\0的位置。会获取空格,\n,遇到\n后停止读取,获取\n。成功返回存储数据空间首地址,失败返回NULL。

用fputs和fgets实现文件拷贝:

    FILE *fp=fopen("2.c","r");
    if(NULL==fp)
    {
        ERR_MSG("fopen");
        return -1;
    }
    FILE *fq=fopen("1.txt","w");
    if(NULL==fq)
    {   
        ERR_MSG("fopen");
        return -1;                                                                                                   
    } 
    char c[20]="";
    char *p=c;
    int line=0,sum=0;
    while(fgets(c,sizeof(c),fp)!=NULL)//用fgets和fputs进行拷贝
    {
        fputs(c,fq);
        sum+=strlen(c);//计算总字节数
        for(int i=0;i<strlen(c);i++)
        {
            if(*(p+i)=='\n')
                line++;//计算行数
        }
    }
    printf("有%d行,%d字节大小",line,sum);
    if(fclose(fp)<0)
    {
        ERR_MSG("fclose");
        return -1;
    }
    printf("关闭成功\n");
    if(fclose(fq)<0)
    {
        ERR_MSG("fclose");
        return -1;
    }
    printf("关闭成功\n");

11.fwrite(size_t fwrite(const void *ptr,size_t size,size _t nmember,FILE *stream);)

功能:将数据按二进制形式写入指定文件。二进制形式:将数据拆分成一个一个的字符形式写入文件。参数列表:void *ptr填指定要输出的数据的首地址。是一个通用类型指针。size_t size:每个数据占了多少个字节。size_t nmemb:要输出多少个数据。FILE *stream:流指针,指向你要写入的文件。成功返回输出数据个数,失败返回0或者小于nmemb的个数。

12.fread(size_t fread(void *ptr,size_t size,size_t nmember,FILE *stream))

功能:将数据的二进制从指定文件中读取,转换成对应数据。void *ptr:将数据先存储到一个指定位置,填对应位置首地址。size_t size:每个数据占了多少个字节。size_t nmemb:要输出多少个数据。FILE *stream:流指针,指向读取数据的文件。成功返回输出数据个数,失败返回0或者小于nmemb的个数。

用fwrite和fread实现文件拷贝:

    FILE *fp=fopen("1.c","r");
    if(NULL==fp)
    {   
        ERR_MSG("fopen");
        return -1; 
    }   
    FILE *fq=fopen("copy1.txt","w");
    if(NULL==fq)
    {   
        ERR_MSG("fopen");
        return -1; 
    }   
    char str[2]="";
    while(fread(str,1,1,fp)!=0)
    {   
        printf("%s",str);
        fwrite(str,1,1,fq);
    }   
    fclose(fp);
    fclose(fq);

13.fseek(int fseek(FILE *stream,long offset,int whence))

功能:修改文件的偏移量,到指定位置。FILE *stream:流指针指向你想修改偏移量的文件。whence:有三种指定位置,文件开头:SEEK_SET,文件当前位置:SEEK_CUR,文件结尾位置:SEEK_END。long offset:填距离whence的偏移量,正数向后,负数向前。文件开头后不能向前偏移,但以"r+,w,w+"形式文件偏移量在结尾时再往后偏移会添加^@,"a,a+"方式打开往后偏移不会添加^@,只会从文件最后一个有效字符写入。

14.ftell(long ftell(FILE *stream);)

功能:返回文件当前位置举例文件开头的偏移量,失败返回-1,更新errno。当文件偏移到最后时,获取的文件偏移量的值就是文件大小。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值