C++:文件操作

1. 如果不存在文件夹就创建文件夹

  函数access可以判断文件或文件夹是否存在。mkdir可以创建文件夹,但不能递归创建。这里写了一个函数mkdirp用于递归创建文件夹。

#include <iostream>
#include <unistd.h>
#include <sys/stat.h>
#include <sstream>

using namespace std;

int mkdirp(const string path) {
	string temp_path = path;

	if(temp_path[0] == '/')
		if(temp_path.substr(0, 5).compare("/home") != 0)
			return -1;

	for(size_t i=1; i<temp_path.length(); i++)
		if(temp_path[i] == '/')
			temp_path[i] = ' ';

	string prefix = "";
	stringstream ss;
	ss << temp_path;
	while(ss >> temp_path) {
		prefix += temp_path;

		//cout << prefix << endl;
		if(access(prefix.c_str(), F_OK) != 0)
			if(mkdir(prefix.c_str(), S_IRUSR | S_IWUSR | S_IXUSR | S_IRWXG | S_IRWXO) !=0)
				return -1;

		prefix += '/';
	}
	return 0;
}

int main() {
	const string output_dir = "/home/<yourname>/video/1/2/asd";
	cout << mkdirp(output_dir) << endl;
}
  • 第11 - 13行:如果从根目录创建文加夹,确保只能从/home开始。
  • 第15 - 17行:从下标1开始,把路径字符串的’ / '换成空格,这样便于使用stringstream分割字符串。之所以不从下标0开始,是因为路径可能以/home开始。
  • 第26行:判断文件夹是否存在。
  • 第27行:判断创建文件夹是否成功。
    [参考]

  还可以使用system函数执行系统命令递归地创建文件夹:

#include <unistd.h>
#include <iostream>
#include <stdlib.h>

using namespace std;

void mkdirp(const string Path) {
	if(access(Path.c_str(), F_OK) == -1) {
		string dir = "mkdir -p " + Path;
		system(dir.c_str());
	}
}

int main() {
	const string output_dir = "/home/omen/video/1/2/asd";
	mkdirp(output_dir);
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
06-01
sstream是C++标准库中的一个类,它提供了将字符串作为流来处理的功能。我们可以使用sstream来进行字符串的输入输出,以及字符串和其他类型的转换。其中,stringstream继承自iostream类,因此它可以使用iostream中的输入输出操作符(<<和>>),也可以使用iostream中的流操作(如getline函数)。 使用stringstream时,我们需要先创建一个stringstream对象,并将需要处理的字符串传递给它。然后,我们可以使用iostream中的输入输出操作符或流操作来对字符串进行处理。例如: ```c++ #include <sstream> #include <iostream> #include <string> using namespace std; int main() { stringstream ss("123 4.56"); // 创建一个stringstream对象,并初始化为"123 4.56" int num; double dbl; ss >> num >> dbl; // 从stringstream中读取数据到变量num和dbl中 cout << "num = " << num << ", dbl = " << dbl << endl; stringstream ss2; ss2 << "Hello, " << "world!"; // 将字符串拼接到stringstream中 string str; getline(ss2, str); // 从stringstream中读取拼接后的字符串 cout << str << endl; return 0; } ``` 输出结果为: ``` num = 123, dbl = 4.56 Hello, world! ``` 在这个例子中,我们首先创建了一个stringstream对象,并将其初始化为"123 4.56"。然后,我们使用iostream中的输入操作符(>>)将stringstream中的数据读取到变量num和dbl中。接下来,我们创建了另一个stringstream对象,并使用iostream中的输出操作符(<<)将字符串拼接到stringstream中。最后,我们使用iostream中的流操作(getline函数)从stringstream中读取拼接后的字符串。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值