C++文件处理的几点操作

<span style="font-family: Arial, Helvetica, sans-serif;">由于整理图片需要用到一些简单的文件处理操作,将遇到的tips记录下来,以备后用:</span>

1、关于新建文件夹

char num_tmp[10];
itoa(j,num_tmp,10);
char *new_dir="F://gt_db//";
string my_dest_dir=dest_dir+num_tmp+"//";
char   char_dest_dir[50];
strcpy(char_dest_dir,new_dir);    //字符串复制
strcat(char_dest_dir,num_tmp);      //字符串连接
if (_mkdir( char_dest_dir ) == 0)    //新建文件夹

利用上面程序可以循环新建文件夹 ,需要用到头文件  #include <direct.h>。 如果此文件夹已存在,则不会在新建。上面程序中还含有简单的字符串操作。

2、关于在文件中续写:

<pre name="code" class="cpp">file.open("annotation.txt",ios::app);

 上面这句话可以实现在文件中续写内容,不过这个文件事先建立好(我是这么做的),需要的时候直接打开就行。起作用的就是后面的ios::app。 

3、保存图片:

Mat faceRGB=img(maxface);
imwrite(my_dest_dir+imgname,faceRGB);

第一句是从原图中截图去骗,maxface是cv::rect的变量,img为cv::mat的文件。

第一个参数为图片全路径名(包括位置和文件名),第二个参数为mat图片。

4、删除文件操作:

string deleteimg_str=my_src_dir+imgname;
const char *deleteimg=deleteimg_str.c_str();
if (DeleteFile(deleteimg)) 
	printf("Removed %s.\n",deleteimg_str); 
else 
	perror("remove");    return 0; 

开始用的是remove函数,提示无法删除;于是就用了DeleteFile函数,但是注意里面的参数为LPCSTR格式,我用的是const char*,在项目设置中设置字符集为未设置,默认是使用Unicode的,这个地方注意改一下,改为未设置。在Debug下可以用const char*作为DeleteFile的参数,但是在Release模式下需要用下面6点所说的LPCSTR格式的。

5、图片保存:

imwrite(my_dest_dir+"//"+imgname,img);

用imwrite保存图片,发现一个问题就是原图为18.9k,保存后新图30多k。而且如果原来保存的位置含有文件名相同的文件们,则会进行替换。


6、关于string到的LPCSTR转换:

string deleteimg_str=my_src_dir+imgname;
const char *deleteimg=deleteimg_str.c_str();						
size_t size = deleteimg_str.length();
wchar_t *buffer = new wchar_t[size+1];
MultiByteToWideChar( CP_ACP, 0, deleteimg_str.c_str(), size, buffer, size * sizeof(wchar_t) );
buffer[size] = 0;  // 确保以 '\0' 结尾 

buffer中就含有需要的LPCSTR格式内容,用完后记得delete buffer;

7、DeleteFile一直无法删除:

用GetLastError函数查看,Visual C++ 中,可以在监视窗口添加 $err,hr 一行来实时显示错误。发现错误代码是5,就是【5】-拒绝访问。所以修改文件夹属性。

8、不适用imwrite来幅值图片,同样适用于一般文件的复制:

_mkdir( char_dest_dir );
string OldFileName=src_dir+imgname;
string NewFileName=my_dest_dir+"//"+imgname;
LPCTSTR lpOldFileName=OldFileName.c_str();
LPCTSTR lpNewFileName=NewFileName.c_str();
CopyFile(
	lpOldFileName, //pointer to name of an existing file
	lpNewFileName,      //pointer to filename to copy to
	TRUE          //flag for operation if file exists  设为TRUE表示目标文件存在的话就复制失败
	 );

使用的是Copyfile函数。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值