C语言文件IO函数介绍

C语言文件IO函数介绍

#include <iostream>
extern "C"
{
    #include <stdio.h>
    #include <string.h>
    #include <sys/types.h>
    #include <fcntl.h>
    #include <unistd.h>
    #include <string.h>
    #include <sys/stat.h>
    #include <stdlib.h>
}
using namespace std;
int main(int argc, char const *argv[])
{
    /*
        标准输入:stdin    0
        标准输出:stdout   1 
        标准出错:stderr   2
        标准日志:stdlog
        《1》ferror(FILE*)函数检查stream(流)中的错误, 如果没发生成功返回0,否则返回非零. 如果发生错误, 使用perror()检测发生什么错误. 
        《2》clearerr(FILE*)函数重置错误标记和给出的流的EOF指针. 当发生错误时,你可以使用perror()判断实际上发生了何种错误. 
        《3》如果给出的文件流是一个输出流,那么fflush()把输出到缓冲区的内容写入文件. 
        如果给出的文件流是输入类型的,那么fflush()会清除输入缓冲区. 
        fflush()在调试时很实用,特别是对于在程序中输出到屏幕前发生错误片段时. 
        直接调用 fflush( STDOUT )输出可以保证你的调试输出可以在正确的时间输出. 


    */
    
    //重新学文件IO
    FILE*fd = fopen("test.txt","w+");
   
    //r:只读   rb:二进制只读   r+:读写    rb+:二进制读写  
    //w:清空式创建文件只写   wb:创建二进制文件只写   w+:创建读写允许  wb+:新建二进制文件读写
    //a:新建二进制文件存在的清空只写   ab:新建打开二进制文件只允许末尾追加写  a+:读加末尾追加写   ab+:新建二进制文件可读末尾追写
    
    int ret =feof(fd);  //当到文件尾时:返回值:成功:到达文件尾ret!=0,  ,失败:没到文件尾=0
    if(fd == NULL)
    {
        perror("文件打开失败");  //输出错误信息
        return -1;
    }
    int isfd = fgetc(fd);   //fgetc意为从文件指针stream指向的文件中读取一个字符,读取一个字节后,光标位置后移一个字节。
    printf("%c\n",isfd);     //获取一次后文件描述符往后移动了
    isfd = fgetc(fd);       //从光标位置在读,以前的后一位, 返回值:光标的下标值
    printf("%c\n",isfd);


    //int putc( int ch, FILE *stream );
    //putc()函数把字符ch写到stream(流)中. 返回值是写入的字符, 发生错误时返回EOF.
    char pp = putc('M',fd);
    cout<<"pp="<< pp<<endl;

    char buffer[1024]={0};  
    fseek(fd,0L,SEEK_END);  //将文件描述符移到末尾
    int end =ftell(fd);     //获得文件文件中所有字符的个数,形同strlen();
    cout<<"字符的个数="<<end<<endl; 

    //有end个字符,每次读一个,读end次
    fseek(fd,0L,SEEK_SET);  //设置文件描述符的偏移位置  FILE*:  fd;  第二个参数:设置之后位置起始位置(long);  第三个参数:偏移的位置:SEEK_SET 开头  SEEK_CUR当前  SEEK_END结束  
    fread(buffer,1,end,fd);  //存在buffer,第二个参数_size:每次读取字节数, _n:读取的次数,  FILE*:文件指针描述符
    printf("buffer= %s\n",buffer);
    //end:字符的个数(X86: 数字字母:1一个字节    汉字:3个字节代表一个汉字)
    fprintf(stdout,"printf\n"); //标准输出
    fprintf(stderr,"error\n");  //标准出错
    fprintf(stdout,"vlog\n");   //标准日志

    char jb[10];
    int a=10000;
    sprintf(jb,"打印 %d  打印%s", a, buffer);
    cout<<jb<<endl;
    
    fseek(fd,0L,SEEK_SET); //归位
    cout<<"fd ="<<fd<<endl;
   
    // fpos_t  *seek;    //int fgetpos( FILE *stream, fpos_t *position );
    // int yt =fgetpos(fd,seek); //fgetpos()函数保存给出的文件流(stream)的位置指针 到给出的位置变量(position)中.
    // printf("%d\n", yt);
    // if(yt==0)
    // {
    //     cout<<"执行成功"<<endl;
    //     cout<<"seek="<<seek<<endl;
    // }


    // int fsetpos( FILE *stream, const fpos_t *position );
    // fsetpos()函数把给出的流的位置指针移到由position对象指定的位置. 
    //fpos_t是在stdio.h中定义的. fsetpos()执行成功返回0,失败时返回非零. 

   
    // char *fgets( char *str, int num, FILE *stream );
    // char k[20];
    // fgets(k, 20, fd);  //函数fgets()从给出的文件流中读取[num - 1]个字符并且把它们转储到str(字符串)中.
    //fgets(k, 20, stdin);  
    // cout<<"k="<<endl;

    //函数fputc()把给出的字符ch写到给出的输出流. 返回值是字符, 发生错误时返回值是EOF.
    fseek(fd,0L,SEEK_END); //尾追
    int lm = fputc('A', fd);  //将A写入文件   lm=65
    cout<<lm<<endl;
    fputc('B', fd); 
    fread(buffer,50,1,fd); 
    printf("buffer1= %s\n",buffer);
    const char nnn[12]="34334545";
    //fputs()函数把str(字符串)指向的字符写到给出的输出流. 成功时返回非负值, 失败时返回EOF. 
    fputs(nnn, fd);
    fread(buffer,100,1,fd); 
    printf("buffe2= %s\n",buffer);

    //FILE *freopen( const char *fname, const char *mode, FILE *stream );freopen()函数常用于再分配一个以存在的流给一个不同的文件和方式(mode).
    // printf("该文本重定向到 stdout\n");
    // FILE *fdfd =freopen("new.txt", "w+", stdout);  //将输出缓冲区的内容重定向到文件  stream->stdin   stdout    stderr
    // cout<<"我要去new.txt里面"<<endl;
    // cout<<"我要去new.txt里面23333"<<endl;
   
    //putchar()函数把ch写到STDOUT(标准输出). 代码 
    //putchar( ch );和 putc( ch, STDOUT );一样.


    //int puts( char *str );
    //函数puts()把str(字符串)写到STDOUT(标准输出)上. puts() 成功时返回非负值, 失败时返回EOF. 

    putchar('J');  
    puts("BBBBB");
    fprintf(stdout, " \n\n");

    //函数fscanf()以scanf()的执行方式从给出的文件流中读取数据. int fscanf( FILE *stream, const char *format, ... );
    //fscanf()的返回值是事实上已赋值的变量的数,如果未进行任何分配时返回EOF. 
    fseek(fd, 0L , SEEK_SET);
    char refd[200];
    fscanf(fd,"%s",refd); //从文件读数据到数组
    cout<<"refd=" << refd <<endl;

    //int rename( const char *oldfname, const char *newfname );
    //函数rename()更改文件oldfname的名称为newfname. rename()成功时返回0,错误时返回非零. 
    rename("test.txt", "newparent.html");
    rename("newparent.html", "text.txt");

    //函数rewind(FILE*fd)把文件指针移到由stream(流)指定的开始处, 同时清除和流相关的错误和EOF标记. 
    rewind(fd);
    fread(buffer,100,1,fd); 
    printf("buffe3= %s\n",buffer);


    //void setbuf( FILE *stream, char *buffer );
    //setbuf()函数设置stream(流)使用buffer(缓冲区),如果buffer(缓冲区)是null,关闭缓冲. 如果使用非标准缓冲尺寸, 它应该由BUFSIZ字符决定长度. 
    char *vuf;
    
    setbuf(fd,vuf);  //文件的数据存储在vuf
    rewind(fd);
    fread(buffer,100,1,fd); 
    printf("vuf= %s\n",vuf);
/*
    int setvbuf( FILE *stream, char *buffer, int mode, size_t size );
    函数setvbuf()设置用于stream(流)的缓冲区到buffer(缓冲区),其大小为size(大小). mode(方式)可以是: 
    _IOFBF, 表示完全缓冲 
    _IOLBF, 表示线缓冲 
    _IONBF, 表示无缓存 
*/
    setvbuf(fd, vuf, _IOLBF, 20 );
    rewind(fd);
    fread(buffer,100,1,fd); 
    printf("vuf1= %s\n",vuf); //  _IONBF, 表示无缓存 :  不显示结果

    //int sprintf( char *buffer, const char *format, ... );
    //sprintf()函数和printf()类似, 只是把输出发送到buffer(缓冲区)中.返回值是写入的字符数量.
    // char *n;
    // const char *l="dshjfjdhfjjfsdjfsdf";
    // sprintf(n, "%s" ,l);
    // cout<<"n=="<<n<<endl;


    //int sscanf( const char *buffer, const char *format, ... );
    //函数sscanf()和scanf()类似, 只是输入从buffer(缓冲区)中读取. 
    int day, year;
    char weekday[20], month[20], dtm[100];
    strcpy( dtm, "Saturday  March 25 1989" ); //空格是一个间隔标志  从dtm按照字符本身的格式获取你想要的值
    sscanf( dtm, "%s %s %d  %d", weekday, month, &day, &year );
    printf("%s %d, %d = %s\n", month, day, year, weekday );


    cout<<fd->_file; //3  其他文件流下表是3开始


    //int remove( const char *fname );
    //remove()函数删除由fname(文件名)指定的文件. remove()成功时返回0,如果发生错误返回非零. 
    getchar();
    //remove("new.txt"); //用于删除文件  参数:文件的绝对路径


    //关闭文件
    fclose(fd);
    return 0;
}
输出:
PS C:\Users\Administrator\Desktop\C语言函数集合> g++ .\标准C中IO.cpp
PS C:\Users\Administrator\Desktop\C语言函数集合> ./a
□
□
pp=M
字符的个数=1
buffer= M
printf
error
vlog
打印 10000  打印00
fd =0x800073928
65
buffer1= 00  打印00
buffe2= 00  打印00
JBBBBB


refd=MAB34334545
buffe3= MAB343345450
vuf= MAB34334545□
vuf1= MAB34334545□
March 25, 1989 = Saturday
3
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Qt历险记

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值