C和C++读写文件比较
C
C语言使用fopen打开文件,fclose关闭文件.
FILE * fout = fopen ( const char * filename, const char * mode );
传入参数分别是文件名filename,和打开的模式mode。返回值是一个文件类型的指针(FILE*),拿到这个文件指针以后就可以访问文件缓冲区中对应的文件。而文件打开的模式,如下表所示:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(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语言来讲的一大优势。