文件夹目录读取
int getAbsoluteFiles(string directory, vector<string>& filesAbsolutePath) //参数1[in]要变量的目录 参数2[out]存储文件名
{
DIR* dir = opendir(directory.c_str()); //打开目录 DIR-->类似目录句柄的东西
if ( dir == NULL )
{
cout<<directory<<" is not a directory or not exist!"<<endl;
return -1;
}
struct dirent* d_ent = NULL; //dirent-->会存储文件的各种属性
char fullpath[128] = {0};
char dot[3] = "."; //linux每个下面都有一个 . 和 .. 要把这两个都去掉
char dotdot[6] = "..";
while ( (d_ent = readdir(dir)) != NULL ) //一行一行的读目录下的东西,这个东西的属性放到dirent的变量中
{
if ( (strcmp(d_ent->d_name, dot) != 0)
&& (strcmp(d_ent->d_name, dotdot) != 0) ) //忽略 . 和 ..
{
if ( d_ent->d_type == DT_DIR ) //d_type可以看到当前的东西的类型,DT_DIR代表当前都到的是目录,在usr/include/dirent.h中定义的
{
string newDirectory = directory + string("/") + string(d_ent->d_name); //d_name中存储了子目录的名字
if( directory[directory.length()-1] == '/')
{
newDirectory = directory + string(d_ent->d_name);
}
if ( -1 == getAbsoluteFiles(newDirectory, filesAbsolutePath) ) //递归子目录
{
return -1;
}
}
else //如果不是目录
{
string absolutePath = directory + string("/") + string(d_ent->d_name); //构建绝对路径
if( directory[directory.length()-1] == '/') //如果传入的目录最后是/--> 例如a/b/ 那么后面直接链接文件名
{
absolutePath = directory + string(d_ent->d_name); // /a/b/1.txt
}
filesAbsolutePath.push_back(absolutePath);
}
}
}
closedir(dir);
return 0;
}
iostream读写文件
打开方式 | 解释 |
---|---|
ios::in | 为读文件而打开文件 |
ios::out | 为写文件而打开文件 |
ios::ate | 初始位置:文件尾 |
ios::app | 追加方式写文件 |
ios::trunc | 如果文件存在先删除,再创建 |
ios::binary | 二进制方式 |
便于记忆:
以代码本身为主体,
向外输出out,即为写文件;
向内读入in,即为读文件。
//文本文件 读文件
#include<iostream>
#include<fstream>
#include<string>
using namespace std;
//文本文件 写文件
void writeFile() {
//1、包含头文件fstream
// 2、创建对象流
ofstream ofs;
// 3、指定打开方式
ofs.open("test.txt", ios::out);
// 4、写文件
ofs << "姓名:张三 " << endl;
ofs << "性别:男" << endl;
ofs << "年龄:18" << endl;
// 5、关闭文件
ofs.close();
}
//文本文件 读文件
void readFile() {
//1、包含头文件fstream
//2、创建对象流
ifstream ifs;
// 3、打开文件,并判断是否打开成功
ifs.open("test.txt", ios::in);
if (!ifs.is_open()) {
cout << "文件打开失败" << endl;
return;
}
//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;
//}
}
int main() {
writeFile();
readFile();
return 0;
}