文本文件
文件打开方式
注意:文件打开方式可以配合使用,利用|操作符
例如:用二进制方式写文件 ios::binary | ios::out
写文件
步骤:
Setp1:包含头文件 #include<fstream>
Setp2:创建流对象 ofstream ofs;
Setp3:打开文件 ofs.open("文件路径", 打开方式);
Setp4:写数据 ofs << "写入的数据";
Setp5:关闭文件 ofs.close();
代码示例:
#include<iostream>
//1、包含头文件
#include<fstream>
using namespace std;
//文本文件-写文件
void test01()
{
//2、创建流对象
ofstream ofs;
//3、打开文件,不指定目录的话创建在当前目录下
ofs.open("test2.txt", ios::out);
//4、写文件
ofs << "Name: Trump" << endl;
ofs << "Sex: Male" << endl;
ofs << "Age: 80" << endl;
//5、关闭文件
ofs.close();
}
int main()
{
test01();
return 0;
}
头文件
#include<fstream>
:引入文件流库,该库提供了用于文件输入输出操作的类和函数,是实现文件读写功能的关键。
test01
函数部分
//文本文件-写文件
void test01()
{
//2、创建流对象
ofstream ofs;
//3、打开文件,不指定目录的话创建在当前目录下
ofs.open("test2.txt", ios::out);
//4、写文件
ofs << "Name: Trump" << endl;
ofs << "Sex: Male" << endl;
ofs << "Age: 80" << endl;
//5、关闭文件
ofs.close();
}
创建流对象
ofstream ofs;
ofstream
是 fstream
库中用于文件输出操作的类,这里创建了一个 ofstream
类型的对象 ofs
,后续将使用它来进行文件写入操作。
打开文件
ofs.open("test2.txt", ios::out);
open
是 ofstream
类的成员函数,用于打开指定的文件。第一个参数 "test2.txt"
是要打开的文件名,如果该文件不存在,会自动创建;第二个参数 ios::out
是文件打开模式,表示以输出模式打开文件,即用于写入数据。
写文件
ofs << "Name: Trump" << endl;
ofs << "Sex: Male" << endl;
ofs << "Age: 80" << endl;
ofs
是之前创建的 ofstream
类型的对象,代表着一个打开的文件输出流。
这里使用了和 cout
类似的 <<
运算符,将文本信息写入到文件中。
注:输出流操作符 "<<"
:在 C++ 里,<<
不仅是左移操作符,还能作为输出流操作符使用。当和 cout
搭配时,它把数据输出到控制台;当和文件输出流对象(像 ofstream
)搭配时,它把数据写入到文件中。
这里的写入文件方式是从头重新写!!
就算原来文件里有内容也会被清空!!!
关闭文件
ofs.close();
close
是 ofstream
类的成员函数,用于关闭已打开的文件。关闭文件是一个良好的编程习惯,它可以确保文件中的数据被正确保存,同时释放系统资源。
main函数
int main()
{
test01();
return 0;
}
这里调用了 test01
函数,从而执行文件写入操作。最后返回 0 表示程序正常结束。
注意事项:
错误处理:上面例子中没有对文件打开操作进行错误处理,如果文件无法打开(例如磁盘已满、没有权限等),程序可能会出现未定义行为。可以通过检查 open
函数的返回值或者 ofs
对象的状态来进行错误处理。
文件路径:如果没有指定文件的绝对路径,文件将被创建在程序的当前工作目录下。
小结
文件操作必须包含头文件
写文件可以利用 ofstream,或者 fstream 类
打开文件时需要指定文件路径,以及打开方式
利用<<可以向文件中写数据
操作完毕,要关闭文件
读文件
读文件与写文件步骤类似,但是读取方式更多(此处推荐使用第二种)。
步骤
代码示例
#include<iostream>
//1、包含头文件
#include<fstream>
using namespace std;
//文本文件-读文件
void test01()
{
//2、创建流对象
ifstream ifs;
//3、打开文件,并判断是否打开成功
ifs.open("test1.txt", ios::in);
if (! ifs.is_open())
{
cout << "Failure" << endl;
return;
}
else
{
cout << "File Open Success!" << endl;
}
//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) //EOF:文件结束符 end of file
// {
// cout << c;
// }
//5、关闭文件
ifs.close();
}
int main()
{
test01();
return 0;
}
刚刚提到过的点这里不再赘述。
创建流对象
ifstream ifs;
ifstream
是 fstream
库中用于文件输入操作的类,这里创建了一个 ifstream
类型的对象 ifs
,后续将使用它来进行文件读取操作(不要搞混了,此处是ifstream而不是ofstream)。
打开文件并检查打开状态
ifs.open("test1.txt", ios::in);
if (! ifs.is_open())
{
cout << "Failure" << endl;
return;
}
else
{
cout << "File Open Success!" << endl;
}
ifs.open("test1.txt", ios::in);
:open
是 ifstream
类的成员函数,用于打开指定的文件。第一个参数 "test1.txt"
是要打开的文件名;第二个参数 ios::in
是文件打开模式,表示以读取模式打开文件,即用于读取数据。
ifs.is_open()
:用于检查文件是否成功打开。如果文件打开失败,is_open()
返回 false
,此时输出 "Failure"
并返回,结束函数执行;如果打开成功,输出 "File Open Success!"
。
读取文件内容
方法一
char buf[1024] = {0};
while (ifs >> buf)
{
cout << buf << endl;
}
该方法读到空格就会换行,没有第二种按整行好(除非题目特殊要求,还是掌握了好)
char buf[1024] = {0};
:创建一个大小为 1024 的字符数组 buf
作为缓冲区(初始化为0)。
ifs >> buf
:使用 >>
操作符从文件输入流 ifs
中读取数据,直到遇到空白字符(如空格、制表符、换行符等)为止,将读取的数据存储到 buf
中。当读取成功时,ifs >> buf
返回 true
,继续循环;当读取失败(如到达文件末尾)时,返回 false
,结束循环。
cout << buf << endl;
:将读取到的内容输出到控制台,并换行。
方法二
char buf[1024] = {0};
while (ifs.getline(buf, sizeof(buf)))
{
cout << buf << endl;
}
ifs.getline(buf, sizeof(buf))
:getline
是 ifstream
类的成员函数,用于从文件输入流中读取一行数据,直到遇到换行符为止,将读取的数据存储到 buf
中。sizeof(buf)
表示缓冲区的大小,防止读取的数据超出缓冲区范围。当读取成功时,返回 true
,继续循环;当读取失败(如到达文件末尾)时,返回 false
,结束循环。
这种方法只会读到换行符'\0'之后才会换行,如果是软换行,那么就不会换行。在word中,硬换行是enter键。(下面都一样)
方法三
string buf;
while (getline(ifs, buf))
{
cout << buf << endl;
}
string buf;
:创建一个 string
类型的对象 buf
用于存储读取的一行数据。
getline(ifs, buf)
:getline
是标准库中的函数(与第二种方法中的getline不同),用于从文件输入流 ifs
中读取一行数据,将其存储到 buf
中。当读取成功时,返回 true
,继续循环;当读取失败(如到达文件末尾)时,返回 false
,结束循环。
这种方法只会读到换行符'\0'之后才会换行,如果是软换行,那么就不会换行。在word中,硬换行是enter键。
方法四(不推荐)
char c;
while ((c = ifs.get()) != EOF)
{
cout << c;
}
char c;
:创建一个字符变量 c
用于存储每次读取的字符。
ifs.get()
:get
是 ifstream
类的成员函数,用于从文件输入流中读取一个字符。EOF
是文件结束符,当读取到文件末尾时,ifs.get()
返回 EOF
。
这种方法只会读到换行符'\0'之后才会换行,如果是软换行,那么就不会换行。在word中,硬换行是enter键。
cout << c;
:将读取到的字符输出到控制台。
关闭文件
ifs.close();
close
是 ifstream
类的成员函数,用于关闭已打开的文件。关闭文件是一个良好的编程习惯,它可以确保文件资源被正确释放。