c/c++文件读写操作

转自:https://blog.csdn.net/zouxu634866/article/details/78697088

一、这里的所说的文件是什么意思

不要觉得我们说的文件就是指txt,或者doc才是文件,其实计算机里面的年东西都是文件。当我们用专门的软件打开他们的时候,可以看到里面的东西,有内存也有二进制代码什么的。

二、打开一个文件

打开一个文件的格式

 FILE *p = fopen("/home/zouux/666","wb");//第一个参数是文件的绝对路径这里的路径为linux下的,如果没有这个666文件,会自动创建一个这个文件,第二个参数为模式,这里为写模式
    if(p == NULL)//固定格式
    {
        cout << "fail to open file" << endl;
        return -1;
    }

注意:模式“wb”有一个问题是打开这个文件时会先清空这个文件,如果你想接着以前存在的内容继续写,应该用“ab”模式。

三、写东西进去

首先需要说,将一个数字或者字符串,更或者一个结构体写进文件,可以用到两个函数,一个是fwrite,还有一个是fprintf。

写一个数字:

int a = 1;
fwrite(&a,1,sizeof(a),p);/或者fprintf(p,"%d",a);

写一个字符串:

char str[] = "hello,zouxu";
fwrite(str,1,11,p);//或者fprintf(p,"%s",str);

重点来了:关于fwrite和fprintf 

fwrite写进文件的是二进制数据,专门给计算机读的,用文本打开这个文件是一段乱码。而fprintf写进去的是人们认得到的字符,本质上两种写入方式都对。只不过一个针对计算机。

fwrite第一个参数为写进去的东西的地址,第二个固定为1,第三为写的东西的字符长度,第四个为文件指针。

fprintf第一个参数为文件指针,第二个为写进去的格式(数据类型),第三个为要写进去的名字。

四、关闭文件

fclose(p);//p为文件指针

五、读取文件数据

步骤:先打开文件———在读取数据———关闭文件

FILE *p1 = fopen("/home/zouux/666","rb");//注意:这里模式必须为rb
    if(p1 == NULL)
    {
        cout << "fail to open file" << endl;
        return -1;
    }
    char buff[100];//定义一个缓冲区,用于保存读取出来的数据

    fread(buff,1,100,p1);//第一参数为保存的地址,第二个固定为1,第三个为读多少数据,最后一个为文件指针
    cout << buff;

    fclose(p1);

注意:这里的缓冲区为一个数组,又是也可以为一个变量。比如:

 FILE *p1 = fopen("/home/zouux/666","rb");
    if(p1 == NULL)
    {
        cout << "fail to open file" << endl;
        return -1;
    }
    while(!feof(p1))
    {
        double ss;//这里就为一个缓冲变量,存储读出来的一个数据
        fread(&ss,1,8,p1);//每次读取八字节
        cout << ss <<endl;
    }

    fclose(p1);
    return 0;

六、数据的有效存储格式

前面有提到用fprintf写数据时,如果写的时候格式为%d%d,那么存进去的数据读不出来,如果为%d,%d还可以。这时候用fwrite就体现了他的好处,因为用这个存的格式是可以通过read读出来的,不用特意去安排格式。

所以这里介绍一种最简单的存储格式:按字节存储并按形同字节读取。那么这样读出来的数据一定为原始数据,不会错位。

补充:char类型为1个字节 , short为2字节, int为4字节 ,double、float为8字节

所以存储数据时都统一用double类型的数据,也就是每次写八字节:

FILE *p = fopen("/home/zouux/666","wb");
    if(p == NULL)
    {
        cout << "fail to open file" << endl;
        return -1;
    }
    int i;
    double b=0.1;
    for(i=0;i<=100;i++)
    {
        fwrite(&b,1,8,p);
        b=b+1.0;
    }
    fclose(p);

读数据时每次读8字节:

FILE *p1 = fopen("/home/zouux/666","rb");
    if(p1 == NULL)
    {
        cout << "fail to open file" << endl;
        return -1;
    }
    while(!feof(p1))//这个函数用于检测是否到结尾
    {
        double ss;
        fread(&ss,1,8,p1);
        cout << ss <<endl;
    }

    fclose(p1);
    return 0;

补充:关于feof函数,这个函数用于检测文件指针是否到结尾,因为在创建文件指针时,它是指向第一个数据的,每次执行完read都会向后移动一段距离,距离为该次read读了多少字节的数据。这种读取适用于数据很大,无法一次性读取玩(fread(&ss,1,8,p1);中第三参数就是每次读多少,如果他就等于这些数据总共的大小,就是一次性读完。但是如果他不是,就是分批次读完,这时候就需要feof来检测是否到结尾)
 

七、读取数字数据保存在一个数组中

 FILE *p1 = fopen("/home/zouux/666","rb");
    if(p1 == NULL)
    {
        cout << "fail to open file" << endl;
        return -1;
    }
    double shuzu[15];
    int k=0;
    while(!feof(p1))
    {
        fread(&shuzu[k],1,8,p1);
        k++;
    }

    for(int j=0;j<=9;j++)
        cout << shuzu[j] << " ";

    fclose(p1);

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值