author:&Carlton
tag:C++
topic:【C++】文件操作(囊括特殊情况:读文件遇到的空格被跳过、“文件只读一次”)
website:黑马程序员C++
date:2023年7月31日
目录
文本文件
写文件
源代码
文件情况
读文件
源代码
运行结果
二进制文件
写文件
源代码
文件情况
读文件
源代码
运行情况
文本文件
写文件
1.引用文件操作头文件
2.创建只写文件流对象
3.打开文件并指定打开方式
4.写数据
5.关闭文件
源代码
#include <iostream>
//1.引用文件操作头文件
#include <fstream>
using namespace std;
void test01()
{
//2.创建只写文件流对象
ofstream ofs;
//3.打开文件并指定打开方式
ofs.open("text.txt", ios::out);
//4.写数据
ofs << "姓名: 张三" << endl;
ofs << "性别: 男" << endl;
ofs << "年龄: 18岁" << endl;
//5.关闭文件
ofs.close();
}
int main()
{
test01();
return 0;
}
文件情况
(保存在源文件所在同一最低级文件夹下)
注意:冒号和文字间有空格
读文件
exit()函数与return()函数区别
exit() 函数接受一个整数参数 status,表示程序的终止状态。一般来说,程序正常终止时可以返回 0,表示成功执行。其他非零的状态码可以用来表示不同的错误或异常情况。
调用 exit() 函数会立即终止程序的执行,并且不会执行之后的任何代码。它会执行一些清理工作(如关闭文件、释放内存等)后,直接返回操作系统。需要注意的是,使用 exit() 函数会跳过析构函数的调用,因此可能导致一些资源没有被正确释放。在正常情况下,我们应该使用 return 语句来终止函数或程序,以保证资源的正确释放。 exit() 函数通常用于在出现严重错误或异常情况下终止程序。
源代码
#include <iostream>
#include <fstream>
#include <string>
using namespace std;
void test01()
{
ifstream ifs;
ifs.open("text.txt", ios::in);
if (!ifs.is_open())
{
cout << "文件打开失败!" << endl;
return;
//或者使用exit(1);
/*
exit() 函数接受一个整数参数 status,表示程序的终止状态。一般来说,程序正常终止时可以返回 0,表示成功执行。其他非零的状态码可以用来表示不同的错误或异常情况。
调用 exit() 函数会立即终止程序的执行,并且不会执行之后的任何代码。它会执行一些清理工作(如关闭文件、释放内存等)后,直接返回操作系统。
需要注意的是,使用 exit() 函数会跳过析构函数的调用,因此可能导致一些资源没有被正确释放。在正常情况下,我们应该使用 return 语句来终止函数或程序,以保证资源的正确释放。 exit() 函数通常用于在出现严重错误或异常情况下终止程序。
*/
}
//读文件
//第一种方式
//空格被当作字符串结束标志,单次循环结束,打印换行。
char buf1[1024] = { 0 };
while (ifs >> buf1)
{
cout << buf1 << endl;
}
//第二种方式
//以换行符为字符串结束标志(空格可以作为有效字符存在)
char buf2[1024] = { 0 };
while (ifs.getline(buf2, sizeof(buf2)))
{
cout << buf2 << endl;
}
//第三种方式
//以换行符为字符串结束标志(空格可以作为有效字符存在)
string buf3;
while (getline(ifs,buf3))
{
cout << buf3 << endl;
}
//第四种方式
//以换行符为字符串结束标志(空格可以作为有效字符存在)
char c;
while ((c = ifs.get()) != EOF)
{
cout << c;
}
ifs.close();
}
int main()
{
test01();
return 0;
}
运行结果
第一种读文件方式:
空格被当作字符串结束标志,单次循环结束,打印换行。
其他方式:
以换行符为字符串结束标志(空格可以作为有效字符存在)
另外注意到四种读文件方式都执行但“文件只读一次”,因为文件位置标识符没有更新到文件开头。
二进制文件
写文件
源代码
#include <iostream>
#include <fstream>
using namespace std;
class Person
{
public:
char m_name[50];
int m_age;
};
void test01()
{
Person p = {"张三",18};
ofstream ofs;
ofs.open("person.txt", ios::out | ios::binary);
ofs.write((const char*) & p,sizeof(p));
ofs.close();
}
int main()
{
test01();
return 0;
}
文件情况
读文件
源代码
#include <iostream>
#include <fstream>
using namespace std;
class Person
{
public:
char m_name[50];
int m_age;
};
void test01()
{
ifstream ifs;
ifs.open("person.txt", ios::in | ios::binary);
if (!ifs.is_open())
{
cout << "文件打开失败!" << endl;
return;
}
Person p;
ifs.read((char*)&p, sizeof(p));
cout << "姓名:" << p.m_name << endl;
cout << "年龄:" << p.m_age << endl;
ifs.close();
}
int main()
{
test01();
return 0;
}
运行情况
欢迎指正与分享,谢谢!