IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> C++知识库 -> C++遍历读取文件夹下特定格式的文件(以txt为例) -> 正文阅读

[C++知识库]C++遍历读取文件夹下特定格式的文件(以txt为例)

前言

今天咱们做一点有意思的事情,平时我们批量修改txt文件中的内容,首先想到的就是写一个python小程序才批量修改txt文件内容,那么C++能办到么?当然可以!只不过C++要比python麻烦很多,毕竟python一行代码解决的事情,背后可能就是C++的一个函数体,但是为了学习C++,我们还是姑且看一下吧!其实用C++写一下也是一件很有意思的事情,并且也能学到很多东西!

1.首先是需要提供的库文件

#include <io.h> //最重要的是这个IO库文件啦~
#include <fstream>
#include <string>
#include <vector>
#include <iostream>
using namespace std;

2.获取特定格式文件

//获取特定格式的文件名
void GetAllFormatFiles( string path, vector<string>& files,string format)  
{  
	//文件句柄  
	long hFile   =   0;  
	//文件信息  
	struct _finddata_t fileinfo;  
	string p;  
	if((hFile = _findfirst(p.assign(path).append("\\*" + format).c_str(),&fileinfo)) !=  -1)  //有该文件就进入
	{  
		do  
		{    
			if((fileinfo.attrib &  _A_SUBDIR)) // /*比较文件类型是否是文件夹 attrib,
			//就是所查找文件的属性:__A_ARCH(存档)、_A_HIDDEN(隐藏)、_A_NORMAL(正常)、_A_RDONLY(只读)、 _A_SUBDIR(文件夹)、_A_SYSTEM(系统)。**/
			{  
				if(strcmp(fileinfo.name,".") != 0  &&  strcmp(fileinfo.name,"..") != 0)  
				{
					//files.push_back(p.assign(path).append("\\").append(fileinfo.name) );
					GetAllFormatFiles( p.assign(path).append("\\").append(fileinfo.name), files,format); 
				}
			}
			else  
			{  
				files.push_back(p.assign(path).append("\\").append(fileinfo.name) );  
			}  
		}while(_findnext(hFile, &fileinfo)  == 0);  
 
		_findclose(hFile); 
	} 
} 

这个便是获取特定格式的文件名的函数体啦!
不要着急!咱们慢慢看,慢慢分析!

1. 首先是看参数列表:

(1)需要提供文件夹的路径(2)一个保存文件名的string格式的vector容器(3)一个"format"字符串,也就是你要找什么格式的文件,比如(.txt)格式的文件!

2. 文件句柄

再就是文件句柄,句柄是什么呢?百度百科告诉我们,句柄是这样子的:句柄是Windows系统中对象或实例的标识,这些对象包括模块、应用程序实例、窗口、控制、位图、GDI对象、资源、文件。从数据类型上来看:它只是一个16位的无符号整数。

也就是说:句柄差不多可以理解为一个指针就可以了,句柄就是文件的标识而已。它的数据存储格式是16位的无符号整数。

3. 文件信息

	struct _finddata_t fileinfo; 

这个 fileinfo 的含义我也不太清楚,我姑且就把它当做是可以读取到文件夹的所有的文件信息了。

接着就利用_findfirst函数看 路径文件夹下 是否有对应格式的文件。也就是第一个if语句的功能。
来深度解析一下这句话,p是一个字符串,那么p.assign(path).append("\*" + format)其实就是将文件夹路径在加上特定的文件格式。比如p可以是:"C:/Users/10123/Desktop/python*.txt。后面加一个.c_str()意思就是,返回了一个指向p字符串的可读不可修改常量指针。

_findfirst函数功能是搜索与指定的文件名称匹配的第一个实例,若成功则返回第一个实例的句柄,否则返回-1L。
也就是说,看fileinfo里面是否有txt格式的文件,有就返回该文件的句柄。

(hFile = _findfirst(p.assign(path).append("\\*" + format).c_str(),&fileinfo)) !=  -1

这句代码首先是先_findfirst搜索,然后将返回的结构赋值hFile,然后再将hFile与-1做不等比较。

如果文件夹内有对应的文件时, _findfirst函数,返回句柄数(肯定不是-1)那么hFile赋值为该句柄。接着,条件 != -1 为真,可以进入if条件内。也就是说,文件内有txt格式文件,才能进入if 。否则,进else。

4. 第二个if(do-while循环内)

接着,当有文件时,进入if了,进入了do-while循环。到了第二个if。

if((fileinfo.attrib & _A_SUBDIR)) 这句话是比较文件类型是否是文件夹 attrib,就是所查找文件的属性:__A_ARCH(存档)、_A_HIDDEN(隐藏)、_A_NORMAL(正常)、_A_RDONLY(只读)、 _A_SUBDIR(文件夹)、_A_SYSTEM(系统)。

如果文件夹内部还有文件夹,就依次对该目录下的所有子文件夹都遍历找 含有该格式的文件。

else: 如果不是文件夹了,那当前的fileinfo肯定就是我们要找的文件的fileinfo了,这时候,将文件名(fileinfo.name)加入我们的vector容器内,做保存就可以了。

do-while循环的条件为:

_findnext(hFile, &fileinfo)  == 0

这里,_findnext函数的作用是搜索与_findfirst函数提供的文件名称匹配的下一个实例,若成功则返回0,否则返回-1。

也就是在搜索与txt格式匹配的下一个实例(排除掉已经搜索过的实例)。(算是完成接续遍历了)

最后不要忘记_findclose(hFile)就可以了。

以上就是大致C++遍历读取文件夹下特定格式的文件的所有内容了。在贴上一份对txt文件处理的main函数代码。

int main()
{
	string filePath = "C:/Users/10123/Desktop/python/txt";  
	vector<string> files;  
	// string  distAll = "AllFiles.txt";
 
	//读取所有的文件,包括子文件的文件
	//GetAllFiles(filePath, files);
 
	//读取所有格式为txt的文件
	string format = ".txt";
	GetAllFormatFiles(filePath, files,format);
	// ofstream ofn(distAll);
	int size = files.size(); 
	// ofn<<size<<endl;
	for (int i = 0;i<size;i++)  
	{  
		// ofn<<files[i]<<endl;
        ifstream in(files[i]);  
        // ofstream out;
        // out.open(files[i],ios::out);
        string filename; 
        string line;
        string newline;
        string allline;
        if(in) // 有该文件  
        {
            // cout << 1111<<endl;
            while (getline (in, line)) // line中不包括每行的换行符  
            {   
                // cout << line <<endl;
                newline = '0' + line.substr(1,line.size()-1)+'\n';
                allline +=newline;
                // cout << line << endl;
            }
            allline.erase(allline.size()-1,1);
            ofstream out;
            out.open(files[i],ios::out);
            out << allline;
            out.close();
        }
        else // 没有该文件  
        {  
            cout <<"no such file" << endl;  
        }   
		// cout<< files[i] << endl;
	}
	// ofn.close();
    
	return 0;
}

该main函数的功能是 将txt文件中的每一行的第一个字符改成0,其他不变。并且改过之后的txt文件最后不多余一个换行符!

  C++知识库 最新文章
【C++】友元、嵌套类、异常、RTTI、类型转换
通讯录的思路与实现(C语言)
C++PrimerPlus 第七章 函数-C++的编程模块(
Problem C: 算法9-9~9-12:平衡二叉树的基本
MSVC C++ UTF-8编程
C++进阶 多态原理
简单string类c++实现
我的年度总结
【C语言】以深厚地基筑伟岸高楼-基础篇(六
c语言常见错误合集
上一篇文章      下一篇文章      查看所有文章
加:2021-09-13 09:05:31  更:2021-09-13 09:07:59 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年5日历 -2024/5/20 0:01:24-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码