//先用_findfirst查找第一个文件,若成功则用返回的句柄调用_findnext函数查找其他的文件,当查找完毕后用,用_findclose函数结束查找。
#include<opencv2/opencv.hpp>
#include <stdio.h>
#include <io.h>
#include<iostream>
#include<time.h>
#include<fstream>
using namespace std;
using namespace cv;
const char *to_search = "F: \\RIDH2\\*.png"; //欲查找的文件,支持通配符
char *nameList_txt = "F: \\RIDH2\\train_list.txt";
FILE *fp;
int main()
{
//1、生成所有png文件名称的txt文本
errno_t err;
intptr_t handle; //用于查找的句柄;x64环境下,句柄也在变化,要用_int64 定义句柄,而不是long。 intptr_t是为了跨平台,其长度总是所在平台的位数,所以用来存放地址。
struct _finddata_t fileinfo; //文件信息的结构体
//fp= fopen("F:\\LiuHuan_File\\RIDH2\\train_list2.txt", "w+");此程序会报错
if ((err = fopen_s(&fp, nameList_txt, "w+")) != 0) //对于fopen_s来说,打开文件成功返回0,失败返回非0。
{
printf("can't open file\n");
return 0;
}
handle = _findfirst(to_search, &fileinfo); //第一次查找 如果查找成功的话,将返回一个intptr_t型的唯一的查找用的句柄(就是一个唯一编号)。 若失败,则返回-1。
if (-1 == handle)
return -1;
//fprintf(fp,"positive/%s 0\r",fileinfo.name); //打印出找到的文件的文件名
fprintf(fp, "%s\n", fileinfo.name);
while (!_findnext(handle, &fileinfo)) //搜索与_findfirst函数提供的文件名称匹配的下一个实例,若成功则返回0,否则返回-1
{
//fprintf(fp,"positive/%s 0\r",fileinfo.name);
fprintf(fp, "%s\n", fileinfo.name); //把格式化字符串输出到指定文件中
}
_findclose(handle); //关闭句柄
fclose(fp);
//system("pause");
//2、将txt中的文件名称取出,利用sprintf得到png文件的路径
ifstream file;
file.open(nameList_txt);
int img_index = 0;
while (!file.eof()) //判断当前文件指针位置,是否处于文件结束位置
{
char txt_cont[20];
file.getline(txt_cont, 20); //读取file中一行数据,存放于txt_cont;
char img_file[200], save_file[200];
if (strlen(txt_cont)<1) //上面生成的nameList_txt中尾部多了\n,不知道有没有更好的方法
{
break;
}
sprintf(img_file, "F: \\RIDH2\\%s", txt_cont); //sprintf把格式化字符串输出到指定字符串
Mat src = imread(img_file);
Mat dst;
//cvtColor(src, dst, CV_BGR2GRAY);
/*sprintf(save_file, "F:\\LiuHuan_File\\RIDH1\\save\\%s", img_index);
img_index++;*/
sprintf(save_file, "F: \\RIDH2\\save\\%s", txt_cont);
imwrite(save_file, src);
}
printf("output done.\n");
return 0;
}