C和C++读写文件比较

文章介绍了C语言中使用fopen和fclose进行文件操作,并展示了如何使用fprintf和fscanf进行格式化读写。接着,对比了C++的fstream方法,强调了C++在处理自定义类型时的便利性。
摘要由CSDN通过智能技术生成

C和C++读写文件比较

C

C语言使用fopen打开文件,fclose关闭文件.

FILE * fout = fopen ( const char * filename, const char * mode );

传入参数分别是文件名filename,和打开的模式mode。返回值是一个文件类型的指针(FILE*),拿到这个文件指针以后就可以访问文件缓冲区中对应的文件。而文件打开的模式,如下表所示:

img[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ETeIiDpw-1675781955068)(data:image/gif;base64,R0lGODlhAQABAPABAP///wAAACH5BAEKAAAALAAAAAABAAEAAAICRAEAOw==)]编辑

这些模式其实很好理解,'r’即read,代表只读模式;’w‘即write,达标只写模式,那’r+‘和’w+‘自然代表可读可写模式; ’b‘即binary,代表以二进制的形式打开,自然’rb‘达标以二进制形式读取,’wb‘代表以二进制形式写入文件。

int main()
{
    FILE* fout = fopen("test.txt", "w");
    fclose(fout);
    return 0;
}

以上代码则完成了以可读写的方式新建并打开了一个"test.txt"文件,并关闭。任何文件在使用完以后都要关闭文件,就如同动态申请的内存,在使用完以后要free掉一个道理。

现在我们尝试往这个文件里面写入数据。

#include <stdio.h>

struct Date
{
    size_t _year;
    size_t _month;
    size_t _day;

    Date(size_t year, size_t month, size_t day)
    {
        _year = year;
        _month = month;
        _day = day;
    }
};
int main()
{
    Date date(2023, 2, 7);
    FILE* fout = fopen("test.txt", "w");
    fprintf(fout, "%u %u %u", date._year, date._month, date._day);
    fclose(fout);
    return 0;
}

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-yzsEWAmJ-1675781955068)(C:\Users\27679\AppData\Roaming\Typora\typora-user-images\image-20230207210406733.png)]

同理,我们也可以从文件中读入数据。

#include <stdio.h>

struct Date
{
    size_t _year;
    size_t _month;
    size_t _day;

    Date(size_t year = 0, size_t month = 0, size_t day = 0)
    {
        _year = year;
        _month = month;
        _day = day;
    }
};
int main()
{
    Date date;
    FILE* fin = fopen("test.txt", "r");
    fscanf(fin, "%u %u %u", &(date._year), &(date._month), &(date._day));
    fclose(fin);
    printf("%u %u %u", date._year, date._month, date._day);
    return 0;
}

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-qm6rvOgM-1675781955069)(C:\Users\27679\AppData\Roaming\Typora\typora-user-images\image-20230207211524539.png)]

上面仅演示了C语言中格式化读写的两个函数:fprintf,fscanf.有关于其他的读写方式,如下表。

函数功能函数命名返回值
fputc写入字符int fputc ( int character, FILE * stream );写入成功返回写入的字符ASC;否则返回EOF
fputs写入文本行int fputs ( const char * str, FILE * stream );写入成功返回非负数;否则返回EOF
fprintf格式化写入int fprintf ( FILE * stream, const char * format, … );写入成功返回写入的字符个数;否则返回负数
fwrite二进制写入size_t fwrite ( const void * ptr, size_t size, size_t count, FILE * stream );写入成功返回写入的字符个数;否则ferror产生错误信息

C++

与C语言读写文件的方式不同的是,C++是通过创建出文件对象来进行操作的。根据文件内容的数据格式分为二进制文件和文本文件,采用文件流对象操作文件的一般步骤如下:

1.定义一个文件流对象
ifstream ifile(只输入用)
ofstream ofile(只输出用)
fstream iofile(既输入又输出用)

2.使用文件流对象的成员函数打开一个磁盘文件,使得文件流对象和磁盘文件之间建立联系。

3.使用提取和插入运算符对文件进行读写操作,或使用成员函数进行读写。

4.关闭文件

#include <iostream>
#include <fstream>
using namespace std;


struct Date
{
    size_t _year;
    size_t _month;
    size_t _day;

    Date(size_t year = 0, size_t month = 0, size_t day = 0)
    {
        _year = year;
        _month = month;
        _day = day;
    }
};


int main()
{
    Date date(2023, 2, 7);
    ofstream ofs("test.txt", ios::out);
    ofs << date._year << ' ' << date._month << ' ' << date._day;
    return 0;
}

上面程序中,我们定义了一个输出型对象ofs,通过流输出将数据写入到文件中,同理我们也可以通过运算符重载,一次性将整个对象写入文件。

._year << ’ ’ << date._month << ’ ’ << date._day;
return 0;
}


上面程序中,我们定义了一个输出型对象ofs,通过流输出将数据写入到文件中,同理我们也可以通过运算符重载,一次性将整个对象写入文件。

所以我们可以得出,C++的文件读写对于自定义类型能够近乎完美的适配,是相对于C语言来讲的一大优势。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值