C++ 将字符转换为字符串时反斜杠消失
我有一个返回文件夹内容的函数:C++ 将字符转换为字符串时反斜杠消失,c++,string,char,backslash,C++,String,Char,Backslash,我有一个返回文件夹内容的函数: void getDir(const char* d, vector<string> & f) { FILE* pipe = NULL; string pCmd = "dir /B /S " + string(d); char buf[256]; if( NULL == (pipe = _popen(pCmd.c_str(),"rt"))) { cout<<"[Expletiv
void getDir(const char* d, vector<string> & f)
{
FILE* pipe = NULL;
string pCmd = "dir /B /S " + string(d);
char buf[256];
if( NULL == (pipe = _popen(pCmd.c_str(),"rt")))
{
cout<<"[Expletive deleted]"<<endl;
return;
}
while (!feof(pipe))
{
if(fgets(buf,256,pipe) != NULL)
{
f.push_back(string(buf));
}
}
_pclose(pipe);
}
但每次出现故障(vector
文件
为空…)。有人知道我做错了什么吗?放上双反斜杠,因为单反斜杠代表wildchar,所以要将反斜杠作为一个字符,它前面应该加上另一个反斜杠谢谢大家的帮助,特别是感谢Debasish Jana,你是对的。为了将反斜杠作为字符,我在它前面加了另一个反斜杠。但我找到了另一种使用FindFirstFile()FindNextFile()获取文件夹内容的方法,我想与它共享:
std::vector<std::string> getContent(TCHAR *dir, TCHAR *extention){
WIN32_FIND_DATA FindFileData;
HANDLE hFind;
char ch[260];
char defChar;
memset(patter, 0x00, MAX_PATH);
_stprintf_s(patter, extention, dir);
hFind = FindFirstFile(patter, &FindFileData);
if (hFind == INVALID_HANDLE_VALUE)
{
printf ("FindFirstFile failed (%d)\n", GetLastError());
//return 1;
}
else
{
do
{
//ignore current and parent directories
if(_tcscmp(FindFileData.cFileName, TEXT("."))==0 || _tcscmp(FindFileData.cFileName, TEXT(".."))==0)
continue;
if(FindFileData.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY)
{
//ignore directories
}
else
{
//list the Files
files.resize(files.size()+1);
WideCharToMultiByte(CP_ACP,0,FindFileData.cFileName,-1, ch,260,&defChar, NULL);
files[files.size()-1] = std::string(ch);
//_tprintf (TEXT("%s\n"), FindFileData.cFileName);
}
}
while (FindNextFile(hFind, &FindFileData));
FindClose(hFind);
}
return files;
}
std::vector getContent(TCHAR*dir,TCHAR*extension){
WIN32_FIND_DATA FindFileData;
处理高频风;
char-ch[260];
char-defChar;
memset(模式,0x00,最大路径);
_stprintf__s(模式、扩展、方向);
hFind=FindFirstFile(模式和FindFileData);
if(hFind==无效的句柄值)
{
printf(“FindFirstFile失败(%d)\n”,GetLastError());
//返回1;
}
其他的
{
做
{
//忽略当前目录和父目录
如果(_tcscp(FindFileData.cFileName,TEXT(“.”)==0 | | ||_tcscp(FindFileData.cFileName,TEXT(“…”)==0)
继续;
if(FindFileData.dwFileAttributes和文件属性目录)
{
//忽略目录
}
其他的
{
//列出文件
files.resize(files.size()+1);
WideChartMultiByte(CP_ACP,0,FindFileData.cFileName,-1,ch,260,&defChar,NULL);
files[files.size()-1]=std::string(ch);
//_tprintf(文本(“%s\n”)、FindFileData.cFileName);
}
}
while(FindNextFile(hFind和FindFileData));
FindClose(hFind);
}
归还文件;
}
下面是如何调用此函数:
vector<string> ss;
TCHAR *directory = TEXT("D:\\Music");
TCHAR *ext = TEXT("%s\\*.mp3");
ss = getContent(TCHAR *dir, TCHAR *extention)
向量ss;
TCHAR*目录=文本(“D:\\Music”);
TCHAR*ext=TEXT(“%s\\*.mp3”);
ss=getContent(TCHAR*dir,TCHAR*extension)
假设这是在某个windows框上。我想你不是“汤姆”吧?“汤姆”有没有可能让你读取他的用户目录?你是从控制台应用程序上运行的,对吗?它在子系统Windows应用程序中不起作用(也不会返回NULL,这是您所依赖的)。用户tom只是一个例子,实际上我需要获取D:\Music文件夹的内容,并且我对该文件夹有完全访问权限:D,但您是对的,我正在从控制台应用程序运行此功能。那么您对如何简单地获取文件夹内容有什么建议吗?我想如果您在while条件下丢失feof(pipe)
(并移动(fgets(buf,256,pipe)!=NULL),也会发生同样的错误
它可能属于的while条件?这意味着最后一行是正确的字符串。之后出现的任何问题都有不同的原因。
vector<string> ss;
TCHAR *directory = TEXT("D:\\Music");
TCHAR *ext = TEXT("%s\\*.mp3");
ss = getContent(TCHAR *dir, TCHAR *extention)