一、文件的分类
二、文本文件
(一)写文件
读文件有以下步骤:
1、注意要包含头文件
#include
2、创建流对象
ofstream ofs;
3、打开文件
ofs.open("文件路径",打开方式);
文件打开方式有这几种:
打开方式 | 解释 |
---|---|
ios::in | 为输入(读)而打开文件 |
ios::out | 为输出(写)而打开文件 |
ios::ate | 初始位置:文件尾 |
ios::app | 所有输出附加在文件末尾 |
ios::trunc | 如果文件已存在则先删除该文件再创建 |
ios::binary | 二进制方式 |
4、写数据
ofs<<"写入的数据";
5、关闭文件
ofs.close();
注意:文件打开方式是可以组合起来使用的,只要利用 | 操作符就可以了
如:用二进制方式写文件 ios::binary | ios::out
#include
using namespace std;
#include //头文件包含
//文本文件 写文件
void test01() {
//1、包含头文件 fstream
//2、创建流对象
ofstream ofs;
//3、指定打开方式
ofs.open("test.txt", ios::out);
//4、写内容
ofs << "姓名:张三" << endl;
ofs << "性别:男" << endl;
ofs << "年龄:18" << endl;
//5、关闭文件
ofs.close();
}
int main() {
test01();
system("pause");
return 0;
}
此时没有写文件路径,那么默认的就是创建在所在项目同级的目录下
打开test.txt文件,可以看到里面的内容:
(二)读文件
写文件有以下步骤:
1、注意要包含头文件
#include
2、创建流对象
ifstream ifs;
3、打开文件,并判断文件是否打开成功
ifs.open("文件路径",打开方式);
4、读数据
四种方式读取
char buf[1024] = { 0 };
while (ifs >> buf) {//一行一行读取
cout << buf<<endl;
}
char buf[1024] = { 0 };
while (ifs.getline(buf, sizeof(buf))) {
cout << buf << endl;
}
string buf;
while( getline(ifs,buf)) {
cout << buf << endl;
}
char c;
while((c = ifs.get()) != EOF) {//一个字符一个字符读到字符c中,判断下是否读到文件尾了,如果没有读到文件尾,则一直读
cout << c;
}
5、关闭文件
ifs.close();
完整代码如下:
#include
using namespace std;
#include
#include
//文本文件 读文件
void test01() {
//1、包含头文件#include
//2、创建流对象
ifstream ifs;
//3、打开文件 并判断文件是否打开成功
ifs.open("test.txt", ios::in);//打开方式 读
if (!ifs.is_open()) {
cout << "文件打开失败!" << endl;
return;
}
//4、读数据
//第一种
//char buf[1024] = { 0 };//定义一个字符数组 初始化为0 用字符数组来接收读到的数据
//while (ifs >> buf) {//一行一行读取
// cout << buf<
//}
//第二种
//char buf[1024] = { 0 };
//while (ifs.getline(buf, sizeof(buf))) {//ifstream的类对象ifs中含有成员函数getline函数,可以将TXT文件中的内容一行一行的读取,每次读取之后将内容存入buf中。
// cout << buf << endl;
//}
//第三种
//string buf;
//while( getline(ifs,buf)) {//全局函数getline,将输入流ifs作为函数参数传入getline中,并且将读取的数据存在之前就创建好的数组字符串变量buf中
// cout << buf << endl;
//}
//第四种(不推荐)
char c;
while((c = ifs.get()) != EOF) {//一个字符一个字符读到字符c中,判断下是否读到文件尾了,如果没有读到文件尾,则一直读
cout << c;
}
//5、关闭文件
ifs.close();
}
int main() {
test01();
system("pause");
return 0;
}
运行结果为:
三、二进制文件
如果要以二进制的方式对文件进行读写操作,那么打开方式要指定为ios::binary
(一)写文件
打开方式指定为ios::out | ios::binary
通过ofstream和ostream 类的write 成员函数将二进制数据写入文件
write(addressOfBuffer, numberOfBytes),第一个参数是缓冲区的地址,第二个参数是字节数。但是还有一个问题,就是缓冲区中的数据可能是整型、浮点型等等,而这个write成员函数并不会区分这些,只会把缓冲区看成是一个字节数组,因为 C++ 不支持指向字节的指针,因此 write 函数将指定缓冲区的地址是指向 char 的指针,在实际使用时,对原本的指针进行强制类型转换就行了,也就是这样:
write(char *addressOfBuffer, int numberOfBytes);
#include
using namespace std;
#include
//二进制文件 写文件
class Person
{
public:
char mName[64];//姓名
int mAge;//年龄
};
void test01() {
//1、包含头文件#include
//2、创建流对象
ofstream ofs;
//3、打开文件
ofs.open("person.txt", ios::out | ios::binary);
//4、写文件
Person p = { "张三",18 };
ofs.write((const char*)&p, sizeof(Person));//如果直接对p取地址,则是一个Person型,要强制转成const char型
//5、关闭文件
ofs.close();
}
int main() {
test01();
system("pause");
return 0;
}
(二)读文件
打开方式指定为ios::in | ios::binary
利用成员函数read(char *addressOfBuffer, int numberOfBytes)来读文件
#include
using namespace std;
#include
class Person
{
public:
char mName[64];
int mAge;
};
void test01() {
//1、包含头文件#include
//2、创建流对象
ifstream ifs;
//3、打开文件,并判断文件是否打开成功
ifs.open("person.txt",ios::in|ios::binary);
if (!ifs.is_open()) {
cout << "文件打开失败!" << endl;
return;
}
//4、读文件
Person p;
ifs.read((char*)&p, sizeof(p));
cout << "姓名: " << p.mName << " 年龄: " << p.mAge << endl;
//5、关闭文件
ifs.close();
}
int main() {
test01();
system("pause");
return 0;
}