有关编程中出现转换和兼容性的问题

sinat_42272412 2018-05-23 09:18:06
大佬们,我头文件里加了一个在unicode字符集属性下写的算法程序,因为要调用,但是我的工程是多字节字符集,如果我改字符集会出现更多的错误,现在的问题是我怎么才能把这个错误在不更改项目属性的情况下改过来,比如这个wstr是WCHAR*类型的,而FindFirstFile是LPCSTR类型的,还有下面的file是char*类型的,而WChar2Ansi是LPCWSTR类型的,我这段代码该怎么修改,才能不出错,才能让他们可以转换成功,求大佬们帮助,救命啊,小白做毕设抽到了编程类的扛不住啊。附图和代码给诸位大佬。
// 利用winWIN32_FIND_DATA读取文件下的文件名
void readImgNamefromFile(const char* fileName, vector <string> &imgNames)
{
// vector清零 参数设置
imgNames.clear();
WIN32_FIND_DATA file;
int i = 0;
char tempFilePath[MAX_PATH + 1];
char tempFileName[50];
// 转换输入文件名
sprintf_s(tempFilePath, "%s/*", fileName);
// 多字节转换
WCHAR wstr[MAX_PATH] = { 0 };
MultiByteToWideChar(CP_ACP, 0, tempFilePath, -1, wstr, sizeof(wstr));
// 查找该文件待操作文件的相关属性读取到WIN32_FIND_DATA
HANDLE handle = FindFirstFile(wstr, &file);
if (handle != INVALID_HANDLE_VALUE)
{
FindNextFile(handle, &file);
FindNextFile(handle, &file);
// 循环遍历得到文件夹的所有文件名
do
{
sprintf(tempFileName, "%s", fileName);
imgNames.push_back(WChar2Ansi(file.cFileName));
imgNames[i].insert(0, tempFileName);
i++;
} while (FindNextFile(handle, &file));
}
FindClose(handle);
}
点击wstr显示Error:“WCHAR*"类型的实参与”LPCSTR“类型的形参不兼容,
点击file显示Error:"CHAR*"类型的实参与”LPCWSTR“类型的形参不兼容。
...全文
601 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
sinat_42272412 2018-05-24
  • 打赏
  • 举报
回复
引用 1 楼 paschen 的回复:
这取决于你工程属性中字符集是UNICODE还是多字节 在多字节下,FindFirstFile实际是FindFirstFileA,需要的参数类型是LPCSTR,在UNICODEG下实际是FindFirstFile,需要的是LPCWSTR 从你的编译提示看,你工程是多字节的,改成UNICODE则可以 但建议你把一切写成通用的,字符用TCHAR,字符指针用LPTSTR,常量字符指针用LPCTSTR 这样无论是什么都可以正常编译
我把WCHAR改成TCHAR以后,第一个标红的wstr没问题了,但是就// 多字节转换 WCHAR wstr[MAX_PATH] = { 0 }; MultiByteToWideChar(CP_ACP, 0, tempFilePath, -1, wstr, sizeof(wstr));这里又错了,显示tchar与LPWSTR不兼容,下面的file不知道怎么改啊,
paschen 版主 2018-05-24
  • 打赏
  • 举报
回复
这取决于你工程属性中字符集是UNICODE还是多字节 在多字节下,FindFirstFile实际是FindFirstFileA,需要的参数类型是LPCSTR,在UNICODEG下实际是FindFirstFile,需要的是LPCWSTR 从你的编译提示看,你工程是多字节的,改成UNICODE则可以 但建议你把一切写成通用的,字符用TCHAR,字符指针用LPTSTR,常量字符指针用LPCTSTR 这样无论是什么都可以正常编译
paschen 版主 2018-05-24
  • 打赏
  • 举报
回复
引用 5 楼 sinat_42272412的回复:
[quote=引用 4 楼 paschen 的回复:] MultiByteToWideChar倒数第二个参数是本身需要WCHAR类型字符串,而不是通用的,这个函数功能本身就是将多字节转成宽字符
那我把它删了对功能有影响么?下面那个file是没救了么?求前辈帮忙啊,我不会编程都是现学的,这两天解决不了就game over了[/quote] 如果不需要转换,则可以删除
sinat_42272412 2018-05-24
  • 打赏
  • 举报
回复
引用 4 楼 paschen 的回复:
MultiByteToWideChar倒数第二个参数是本身需要WCHAR类型字符串,而不是通用的,这个函数功能本身就是将多字节转成宽字符
那我把它删了对功能有影响么?下面那个file是没救了么?求前辈帮忙啊,我不会编程都是现学的,这两天解决不了就game over了
paschen 版主 2018-05-24
  • 打赏
  • 举报
回复
MultiByteToWideChar倒数第二个参数是本身需要WCHAR类型字符串,而不是通用的,这个函数功能本身就是将多字节转成宽字符
sinat_42272412 2018-05-24
  • 打赏
  • 举报
回复
代码从头开始是这样的 #include <opencv2/highgui/highgui.hpp> #include <opencv2/imgproc/imgproc.hpp> #include <opencv2/core/core.hpp> #include<iostream> #include <stdio.h> #include <windows.h> int threshold_diff1 = 30; //设置简单帧差法阈值 37 int threshold_diff2 = 12;//设置简单帧差法阈值 加黑帽45-47 不加25+ 什么都不加12-14 #define threshold_diff3 50//50 double ROI = 0.87l; //设置ROI #define mode 1 //手动阈值 #define threshold_diff3 50//50 #define threshold_diff4 74//74-77 #define DirectR 17//导向滤波半径 using namespace cv; using namespace std; // LPCWSTR转string std::string WChar2Ansi(LPCWSTR pwszSrc) { int nLen = WideCharToMultiByte(CP_ACP, 0, pwszSrc, -1, NULL, 0, NULL, NULL); if (nLen <= 0) return std::string(""); char* pszDst = new char[nLen]; if (NULL == pszDst) return std::string(""); WideCharToMultiByte(CP_ACP, 0, pwszSrc, -1, pszDst, nLen, NULL, NULL); pszDst[nLen - 1] = 0; std::string strTemp(pszDst); delete[] pszDst; return strTemp; } // 利用winWIN32_FIND_DATA读取文件下的文件名 void readImgNamefromFile(const char* fileName, vector <string> &imgNames) { // vector清零 参数设置 imgNames.clear(); WIN32_FIND_DATA file; int i = 0; char tempFilePath[MAX_PATH + 1]; char tempFileName[50]; // 转换输入文件名 sprintf_s(tempFilePath, "%s/*", fileName); // 多字节转换 TCHAR wstr[MAX_PATH] = { 0 }; MultiByteToWideChar(CP_ACP, 0, tempFilePath, -1, wstr, sizeof(wstr)); // 查找该文件待操作文件的相关属性读取到WIN32_FIND_DATA HANDLE handle = FindFirstFile(wstr, &file); if (handle != INVALID_HANDLE_VALUE) { FindNextFile(handle, &file); FindNextFile(handle, &file); // 循环遍历得到文件夹的所有文件名 do { sprintf(tempFileName, "%s", fileName); imgNames.push_back(WChar2Ansi(file.cFileName)); imgNames[i].insert(0, tempFileName); i++; } while (FindNextFile(handle, &file)); } FindClose(handle); } //计算灰度直方图 Mat calcGrayHist(const Mat & image) { //存储 256 个灰度级的像素数 Mat histogram = Mat::zeros(Size(256, 1), CV_32SC1); int rows = image.rows; int cols = image.cols; for (int r = 0; r < rows; r++) { for (int c = 0; c < cols; c++) { int index = int(image.at<uchar>(r, c)); histogram.at<int>(0, index) += 1; } } return histogram; }
编程工具简介:学习编程捷径:(不论是正在学习编程的大学生,还是IT人士或者是编程爱好者,在学习编程的过程用正确的学习方法 可以达到事半功倍的效果。对于初学者,可以通过下面的方法学习编程,通过对成百上千个实例练习,则很快会成为编程 高手。我们专业从事编程十几年,积累了丰富的编程经验,会陆续制作编程视频供大家学习,级、高级编程我们会专门 制作高级的系列编程课程,难度逐步加深,想学编程的可以关注我们的系列课程。可以就相关编程问题提问。 1、【编程工具分为 免费自由版、专业版、企业版。】首先通过免费自由版熟悉基本操作,通过我们提供的实例视频学习 编程,先快速入门。2、基本入门后,再学习我们提供的编程课程,通过对若干实例的编程练习,基本可以掌握编程思路。 3、想继续加深学习的,可以继续学习高级版编程课程,通过对连接数据库等的学习真正开发出实用的商业管理软件或 定制开发程序。 4、基本掌握了编程思路之后,再学习其他的编程语言或大学里的编程课程则会非常轻松,因为不论是哪个编程语言, 最重要的是学习编程思路,而编程思路基本上是相通的。 5、学习完PC电脑端编程后,还可以继续学习APP手机软件开发。APP手机软件开发需要有PC电脑上开发基础,操作基本类似。6、编程工具为 搭建之星,这个编程工具的特点:1、安装简单、迅速,纯文界面,构件丰富,设计过程直观、自由;无需掌握电脑语言,所有编程构件化、命令化、可视化。2、交互式开发,只需要四种类型的“命令”,便可以建立各构件之间的联系;象搭积木一样简单,并可快速的搭建出具有专业水平的软件作品。3、微解释执行,命令解释量小,执行速度快。可以和编译后的可执行文件相媲美。4、提供打包工具,使您即刻将自制软件安装到其它机器上运行。5、自动对开发项目进行加密;使您的项目,在未经授权下,别人无法“浏览、修改”项目的构件关系与搭建方法。  

64,650

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧