浅谈Linux中文件IO之标准IO

目录

1、标准IO的应用

1.1直接读写      

1.2冲洗一个文件流

1.3设置缓冲区

1.4定位文件流

1.4.1设置光标位置

1.4.2获取光标位置

1.4.3重置光标位置

1.5文件出错/文件结束标志

1.6格式化的输入输出

1.6.1格式化输入

1.6.2格式化输出

2、关于C++对于标准库的支持


谢谢帅气美丽且优秀的你看完我的文章还要点赞、收藏加关注

没错,说的就是你,不用再怀疑!!!

希望我的文章内容能对你有帮助,一起努力吧!!!


·

1、标准IO的应用

1.1直接读写      

  想操作几个字符就操作几个字符

  • fread 、 fwrite

fread 读取

fwrite 写入

#include <iostream>

int main()
{
    FILE *file_ptr = fopen("1.txt","r+");

    char buf[1024]={0};

    /*
    int fread(void *buf,int size,int nmenb,FILE *file)
    {
        int c = 0;
        for(int count = 0;count < nmenb;count++)
        {
            if(size == read(file->fd,buf,size))
                c++;
        }
        return c;
    }
    
     */
    fread(buf,2,5,file_ptr); // 从文件流file_ptr中读取2个字节,一共读取5次,存储到buf指向的空间中

    std::cout << buf << std::endl;

    fwrite("abcdef",2,3,file_ptr);

    fclose(file_ptr);

    return 0;
}

1.2冲洗一个文件流

冲洗流: fflush ,作用就是同步文件。(把缓冲区的内容同步硬件中)

标准IO是带缓冲的IO,读写操作是针对于缓冲区,并不是每次都是操作硬件。

有的时候多线程编程的时候会影响程序结果

#include <iostream>
#include <unistd.h>

int main()
{
    int a,b;

    scanf("%d%d",&a,&b);

    std::cout << a << " " << b << std::endl;

    fflush(NULL);

    int c;
    scanf("%d",&c);

    std::cout << c << std::endl;
    return 0;
}

1.3设置缓冲区

#include <iostream>
#include <cstring>


int main()
{
    FILE * file_ptr = fopen("1.txt","w+");

    // 用户自定义的缓冲区
    char buf[1024]={0};

    // 为stdout标准输出设置一个新的缓冲区
    setvbuf(stdout,buf,_IOLBF,1024);

    std::cout << "程序输出内容:123456789";

    fwrite(buf,1,strlen(buf),file_ptr);


    std::cout << std::endl;
    return 0;
}

注意:函数 setvbuf 只能在一个流被开后,没有进行过任何操作之前使用。

1.4定位文件流

1.4.1设置光标位置

上面有提到 fread 和 fwrite ....只是说明要从哪个文件读写,读写多少个,并没有指明,从哪个位置开 始。标准IO会为每一个打开的文件流,保存一个“文件偏移量”

一般来说,每次读写之前,先确定 定位流(光标)。

fseek 就是用来定位文件流的光标的。

1.4.2获取光标位置

#include  <iostream>


int main()
{
    FILE * file = fopen("1.txt","r+");


    fseek(file,10,SEEK_SET);

    std::cout << ftell(file) << std::endl;


    fclose(file);
    return 0;
}

1.4.3重置光标位置

1.5文件出错/文件结束标志

EOF : End Of File 文件结束的标志

清除文件结束标志

标准IO库中,在读文件内容时候,如果读取到了末尾,会往缓冲区填入一个 EOF (二进制:1111 1111)

1.6格式化的输入输出

1.6.1格式化输入

scanf/sscanf/fscanf...

分为两类参数:

  • 格式化字符串
    • 告诉用户怎么输入,意思就是按我的格式规矩来输入
    • 放在格式化字符串中的字符有三类:
      • 非转义字符/普通字符
        • A B C ... 1 2 3 ... // 必须要按原样输入,精准输入
      • 格式化字符
        • %d %s %c %f %o ....
      • 转义字符
        • \t \x89...
        • 空白字符:
          • \n \t \r ...
  • 参数
    • 要与格式化字符的类型和数量相匹配

注意:格式化字符串中的每一个格式化字符,就对应一个地址,所以在输入的时候,参数要与格式化字 符的类型和数量相匹配,然后需要提供地址。

scanf 什么时候结束输入?

  • scanf 从 stdin 的缓冲区中获取输入
    • 当该输入的都输入完了。
      • scanf("abcd%d %cbcd",&a,&c);
      • abcd123Abcd
    • 用户输入失败
      • scanf(abcd%d %cbcd",&a,&c);
      • ABCD // scanf就会停止匹配,结束

scanf返回成功匹配到的变量个数。

1.6.2格式化输出

#include <iostream>


int main()
{
    FILE *f = fopen("2.txt","r+");

// //-----------------------------fscanf----------------------
//     // 从一个文件流中以指定的格式获取数据
//     int a,b,c;
//     fscanf(f,"%d%d%d",&a,&b,&c); // "std::cin >> "abc" "   std::cin >> a >> b >> c    "std::cin >> "abc""

//     std::cout << a << " " << b << " " << c << std::endl;



// //-----------------------------sscanf----------------------
//     char buf[1024]={"123 45645 64564"};
//     sscanf(buf,"%d%d%d",&a,&b,&c);
//     std::cout << a << " " << b << " " << c << std::endl;


// //-----------------------------fprintf----------------------
//     fprintf(f,"\n%d-%s-%d",123,"abcdefg",456);

 /*
    struct student
    {
        char name[1024];
        int age;
        char sex[5];
    }s;

    fscanf(f,"姓名:%s 年龄:%d 性别:%s",s.name,&s.age,s.sex);

    std::cout << "姓名:" << s.name << "年龄:"<< s.age <<"性别:" << s.sex << std::endl;

    fprintf(f,"\n姓名:%s 年龄:%d 性别:%s","张三",20,"男");
*/   

//------------------------------sprintf---------------------
    char buf[1024]={0};

    sprintf(buf,"%s+%s=%s","123","456","789");

    std::cout << buf << std::endl;
    fclose(f);
    return 0;
}

2、关于C++对于标准库的支持

#include<fstream>

ofstream //文件写操作 内存写入存储设备

ifstream //文件读操作,存储设备读区到内存中

fstream //读写操作,对打开的文件可进行读写操作

在 fstream 类中,成员函数 open() 实现打开文件的操作,从而将数据流和文件进行关联,通过 ofstream,ifstream,fstream 对象进行对文件的读写操作

打开方式

ios::in 为输入(读)而打开文件

ios::out 为输出(写)而打开文件

ios::ate 初始位置:文件尾

ios::app 所有输出附加在文件末尾

ios::trunc 如果文件已存在则先删除该文件

ios::binary 二进制方式

这些方式是能够进行组合使用的,以“或”运算(“|”)的方式

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值