创建和写入文本文件
#include<iostream>
#include<fstream> //ofstream类需要包含的头文件
#include<string>
using namespace std;
int main() {
string filename = R"(D:\test\test.txt)"; // 原始字面量定义文件路径
ofstream ofs;
/**
* 第二个参数打开模式,有三种:
* 1. ios::out 默认值,会截断文件内容
* 2. ios::trunc 截断文件内容
* 3. ios::app 追加写入
*/
ofs.open(filename, ios::out); // 打开文件,若文件不存在,则创建文件
if (ofs.is_open() == false)
{
cout << "打开文件:"<<filename << " 失败了"<<endl;
} else {
ofs << "你好,我叫李雷\n";
ofs << "我是韩梅梅\n";
ofs << "和我在成都的街头走一走,哦哦哦哦哦哦\n";
cout << "文件写入成功..." << endl;
}
ofs.close();
return 0;
}
读取文本文件
#include<iostream>
#include<fstream> //ifstream类需要包含的头文件
#include<string>
using namespace std;
int main() {
string filename = R"(D:\test\test.txt)"; // 原始字面量定义文件路径
ifstream ifs;
ifs.open(filename); // 打开文件,若文件不存在,则打开失败
if (ifs.is_open() == false)
{
cout << "打开文件:"<<filename << " 失败了"<<endl;
} else {
// 第一种读取方式
// string buffer;
// while (getline(ifs, buffer)) // getline 需要#include<string>头文件
// {
// cout << buffer << endl;
// }
cout << "==========" << endl;
// 第二种读取文本文件方式
string buffer;
while (ifs >> buffer)
{
cout << buffer << endl;
}
}
ifs.close();
return 0;
}
写入二进制文件
#include<iostream>
#include<fstream> //ofstream类需要包含的头文件
#include<string>
using namespace std;
class Student
{
public:
char name[128];
int age;
double weight;
};
int main() {
string filename = R"(D:\test\test)"; // 原始字面量定义文件路径
ofstream ofs;
/**
* 第二个参数打开模式,有三种:
* 1. ios::out 默认值,会截断文件内容
* 2. ios::trunc 截断文件内容
* 3. ios::app 追加写入
* 4. ios::binary 二进制写入
*/
ofs.open(filename, ios::app | ios::binary); // 打开文件,若文件不存在,则创建文件
if (ofs.is_open() == false)
{
cout << "打开文件:"<<filename << " 失败了"<<endl;
} else {
Student stu = {"张三", 22, 50.8};
ofs.write((const char *)&stu, sizeof(struct Student));
Student stu1 = {"李四", 45, 66.5};
ofs.write((const char *)&stu1, sizeof(struct Student));
cout << "文件写入成功..." << endl;
}
ofs.close();
return 0;
}
}
和写入文本文件区别是:
- 打开文件的时候,指定打开模式为ios::binary,表示以二进制写入
- 使用ofstream对象的write()方法写入
读取二进制文件
#include<iostream>
#include<fstream> //ifstream类需要包含的头文件
#include<string>
using namespace std;
class Student
{
public:
char name[128];
int age;
double weight;
};
int main() {
string filename = R"(D:\test\test)"; // 原始字面量定义文件路径
ifstream ifs;
ifs.open(filename, ios::binary); // 打开文件,若文件不存在,则打开失败
if (ifs.is_open() == false)
{
cout << "打开文件:"<< filename << " 失败了"<<endl;
} else {
Student stu;
while (ifs.read((char *)&stu, sizeof(stu)))
{
cout << "name:"<<stu.name <<" age:"<<stu.age<<" weight:"<<stu.weight<<endl;
}
}
ifs.close();
return 0;
}
读取二进制文件和文本问价的区别:
- 打开文件使用ios::binary, 以二进制格式打开
- 使用ifstream 的read函数读取自定义结构的内容
fsstream类
fsstream类,既可以读文本/二进制文件,也可以写入文本/二进制文件
fsstream包含ifstream ofstream的读写方法
文件的随机读写
文件位置指针
文件位置指针指向当前文件的读/写位置
- ifstream获取和设置文件指针位置
ifs.tellg(); // 获取文件指针位置
ifs.seekg(55); // 移动文件指针位置到55字节
ifs.seekg(ios::end); // 把文件指针移动到结束位置
ifs.seekg(30, ios::end); // 把文件指针从开始位置,往后移动30个字节
ifs.seekg(-10, ios::cur); // 把文件指针从当前位置往前移动10个字节
ifs.seekg(10, ios::cur); // 把文件指针从当前位置往后移动10个字节
- ofstream获取和设置文件指针位置
ofs.tellp(); 获取文件指针位置
ofs.seekp(30); //把文件指针移动到30字节的位置
ofs.seekp(ios::beg); // 把文件指针移动到开始位置
ofs.seekp(ios::end); // 把文件指针移动到结束位置
文件缓冲区和流状态
文件缓冲区是系统预留的内存空间,用于存放输入或者输出的数据,在c++中,每打开一个文件,系统就会为它分配缓冲区,不同的流缓冲区是独立的。
默认:输出缓冲区满了, 才把数据写入磁盘
输出缓冲区
flush() 直接刷新缓冲区
endl 换行,然后刷新缓冲区
#include<iostream>
#include<fstream> //fstream类需要包含的头文件
#include<string>
#include<unistd.h>
using namespace std;
int main() {
string filename = R"(D:\test\test.txt)"; // 原始字面量定义文件路径
fstream fs;
fs.open(filename); // 打开文件,若文件不存在,则打开失败
fs << unitbuf; // 设置输出流的缓冲方式
// fs << nounitbuf; // 让fs回到缺省的缓冲方式
for (size_t i = 0; i < 1000; i++)
{
// fs << "hello world \n" << endl; // endl换行,然后刷新缓冲区
fs << "hello world \n";
// fs.flush(); 刷新缓冲区
usleep(100000);
}
fs.close();
return 0;
}
流状态
- eof 当输入流操作达到文件末尾时候,将设置eof为1, 使用eof()成员函数获取eof标志位的状态
- 无法诊断的失败破坏流, bad将被置为1, 使用bad()成员函数获取bad标志位的状态
- fail 当输入流操作未能读取预期的字符时,将设置fail为1 ,使用fail()成员函数获取fail标志位的状态
当上述三个流都为0时, good函数返回true
#include<iostream>
#include<fstream> //ifstream类需要包含的头文件
#include<string>
using namespace std;
int main() {
string filename = R"(D:\test\test.txt)"; // 原始字面量定义文件路径
ifstream ifs;
ifs.open(filename); // 打开文件,若文件不存在,则打开失败
if (ifs.is_open() == false)
{
cout << "打开文件:"<<filename << " 失败了"<<endl;
} else {
string buffer;
while (true)
{
ifs >> buffer;
if (ifs.eof()) // 输入流指针达到文件末尾,eof位被置1
{
break;
}
cout << buffer << endl;
}
}
ifs.close();
return 0;
}
网友评论