C++ 读取、写入文件数据

一、文件系统

1、在C++ 17中可以使用 filesystem 。为名字空间起个别名,如:namespace fs = std::filesystem; 

2、需要引入头文件:#include<filesystem>

3、由于使用了C++ 17的特性,所以需要将工程的语言设置成C++ 17 或者更高的版本。具体操作如下:

(1)、右键项目名称,选择“属性

(2)、然后进行如下操作

  

 

 

 

 

二、C++中对文件读取操作

1、判读文件是否存在,并输出文件的大小:

#include<iostream>
#include<filesystem>
#include<string>

using namespace std;

int main() {

	// 由于命名空间名字太长,所以可以将其起一个别名为fs
	namespace fs = experimental::filesystem;
	string path01 = "E:\\Data\\Test01\\out.txt";

	//定义路径:path 是一个类,定义该类的一个实例,并用指定的路径对其进行初始化
	// 可以使用:转义字符串、生字符串、正斜杠字符串来写该路径
	fs::path p1{ path01 };      //1、以转义字符串的方式来写定义该路径
	fs::path p2{ R"(E:\Data\Test01)" }; //2、以生字符串的方式来写
	fs::path p3{ "E:/Data/Test01/out.txt" };   // 3、以正斜杠的方式来写,类似于Linux系统的写法

	// 输出默认文件分隔符
	cout << "file separator is: " <<fs::path::preferred_separator << endl;

	// 判读是否是常规文件,如果是,输出文件大小
	if (fs::is_regular_file(p2)) {
		cout << p2 << "'s size is: " << fs::file_size(p2) << endl;
	}
	// 若不是常规文件,则可能是目录,就用for循环列出其所有子目录
	else  if (fs::is_directory(p2)) {
		cout << p2 << " is a directory,includes: " << endl;
		for (auto& e : fs::directory_iterator(p2)) {
			cout << " " << e.path() << endl;
		}
	}
	// 判断路径是否存在
	else if (fs::exists(p2)) {
		cout << p2 << " is a special file\n";
	}
	else
	{
		cout << p2 << " does not exist" << endl;
	}

	cin.get();

}

2、访问路径里文件的组成成分。如包含文件、子目录:

#include<iostream>
#include<filesystem>
using namespace std;

int main() {
	namespace fs = experimental::filesystem;
	fs::path p1{ R"(E:\Data\Convert)" };
	// 是否存在?根名?根路径?相对路径?
	if (p1.empty()) {
		cout << "Path " << p1 << " is empty." << endl;
	}
	if (!fs::exists(p1)) {
		cout << "Path " << p1 << "does not exist." << endl;
		exit(0);
	}

	cout << "root_name(): " << p1.root_name() << "\n"
		<< "root_path(): " << p1.root_path() << "\n"
		<< "relative_path(): " << p1.relative_path() << "\n";

	// 输出父路径、文件名、文件名主干、扩展名
	cout << "parent_path(): " << p1.parent_path() << "\n"
		<< "filename(): " << p1.filename() << "\n"
		<< "stem(): " << p1.stem() << "\n"
		<< "extension(): " << p1.extension() << endl;

	cin.get();
}

3、path相关的一些特殊运算符用法:

#include<iostream>
#include<filesystem>
using namespace std;

namespace fs = experimental::filesystem;

int main() {
	// 定义路径对象
	fs::path p1{ R"(D:\Temp)" };
	fs::path p2{ R"(D:\Temp)" };
	fs::path p3{ "" };

	// append和/=
	p1.append(R"(test01)"); // 将test01 目录附加到D:\Temp 目录下。
	p1 /= R"(cyd)"; //  操作符 /= 会自动在路径的多个元素之间加上路径分隔符
	cout << p1 << endl;

	// concat和+=
	p2.concat(R"(test02)");
	p2 += R"(cyd)";  //操作符 +=与/=的不同在于+=不会在路径元素之间加路径分隔符
	cout << p2 << endl;

	//用操作符 / 拼接一个新的路径出来,/的第一个左操作数必须是path对象。
	p3 = p3 / R"(D:\Temp)" / R"(test01)" / R"(cyd)";
	cout << p3 << endl;

	cin.get();
}

 

 

 

 

 

  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值