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

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“类型的形参不兼容。
...全文
615 6 打赏 收藏 转发到动态 举报
AI 作业
写回复
用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; }

65,189

社区成员

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

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