我已经尝试了1个小时来找到解决方案,但没有任何工作。我正在使用FindFirstFile函数来获取文件/文件夹列表。这部分工作正常,但是当我尝试使用它的cFilename时,它给出了一个wstring,它几乎没用。我试图将它转换为char来写入文件,它给了我错误。我试图将wstring写入文件,它会混乱并写入第一个文件系统对象,后跟许多空值。这真让我很沮丧,我真的很想得到帮助。我的代码:
{
//wstring writedata = search_data.cFileName + "\n"; //cant append newline to it
//printf(search_data.cFileName); //works
//wstring newline = "\n"; //Cant create newline in wstring
//fwrite(writedata, 1, sizeof(writedata), directorycontents); //writedata I cant set it
//fwrite(search_data.cFileName, 1, sizeof(search_data.cFileName), directorycontents); //writes first fileobject and a lot of nulls, fail
if(FindNextFile(handle, &search_data) == FALSE){
break;}
}
如果有人能告诉我如何将wstring转换为char [],我真的很感激。我也无法找到如何做到这一点,这是我尝试的第一件事。
#include <windows.h>
#include <stdio.h>
#include <string>
using namespace std;
int main(int argc, char* argv[]){WIN32_FIND_DATA search_data;
memset(&search_data, 0, sizeof(WIN32_FIND_DATA));
HANDLE handle = FindFirstFile("c:\\*", &search_data);
FILE *directorycontents = fopen("C:\\testwrite.txt", "w+");
while(handle != INVALID_HANDLE_VALUE)
{
wstring newline = L"\n"; //Cant create newline in wstring
search_data.cFileName += newline;
string test = cstr(search_data.cFileName);
search_data.cFileName += newline;
fwrite(search_data.cFileName, 1, sizeof(search_data.cFileName), directorycontents);
if(FindNextFile(handle, &search_data) == FALSE){
break;}
}}
答案 0 :(得分:3)
// enable / disable both of them to enable/disable unicode
//#define UNICODE
//#define _UNICODE
#include <windows.h>
#include <stdio.h>
#include <tchar.h>
int main(int argc, char* argv[]){
WIN32_FIND_DATA search_data;
memset(&search_data, 0, sizeof(WIN32_FIND_DATA));
HANDLE handle = FindFirstFile(TEXT("c:\\*"), &search_data);
FILE *directorycontents = fopen("C:\\testwrite.txt", "wb");
while(handle != INVALID_HANDLE_VALUE)
{
fwrite(search_data.cFileName, 1, _tcslen(search_data.cFileName) * sizeof(TCHAR), directorycontents);
_fputts(TEXT("\r\n"), directorycontents);
if(FindNextFile(handle, &search_data) == FALSE)
break;
}
}
search_data.cFileName += newline;
此行存在问题,因为cFileName
的类型为TCHAR[]
(TCHAR数组),newline
的类型为wstring
。这些类型不兼容。
您无法使用+=
运算符附加到固定大小的数组。
cstr(search_data.cFileName)
这没有任何意义。函数cstr只能用于string
个对象的类型。
http://en.wikipedia.org/wiki/Null-terminated_string
cFileName
是以空字符结尾的字符串。因此,例如当TCHAR为char
(未定义_UNICODE)时,字符串“Hello”在内存中如下所示:
['H','e','l','l','o', '\0', ...]
这里每个元素占用一个字节,...
可以是任何垃圾。 cFileName
总是具有260个元素的容量,但这并不意味着cFileName中字符串的长度为260长。实际上cFileName中字符串的最大长度是259,因为你总是必须有一个终止'\ 0'元素。
http://www.codeproject.com/Articles/76252/What-are-TCHAR-WCHAR-LPSTR-LPWSTR-LPCTSTR-etc
TCHAR cFileName[MAX_PATH]; //this is how cFileName is defined
sizeof(TCHAR) == 2 // when _UNICODE is defined
sizeof(TCHAR) == 1 // when _UNICODE is defined
TCHAR
时,wchar_t
为_UNICODE
(2个字节)TCHAR
char
(1字节),_UNICODE
不定义。MAX_PATH
定义为260
要获取由TCHAR组成的字符串的长度,您必须使用_tcslen
宏。此宏扩展为strlen
或wcslen
,具体取决于_UNICODE
定义。
您必须知道大小为260 的数组cFileName
不意味着您的字符串具有相同的长度。 cFileName
存储一个C风格的字符串(不管_UNICODE),意味着它以数组中的零元素终止。
如果您想避免使用unicode,请确保在包含_UNICODE
之前未定义windows.h
。您也可以通过将字符集设置为“未设置”来实现此目的,如文章中所示。
使用TCHAR可以更轻松地编译同一程序的unicode和非unicode版本,只需切换一个定义。
wchar_t
和char
字符串之间的转换:
http://msdn.microsoft.com/en-us/library/5d7tc9zw.aspx
http://www.codeproject.com/Articles/2995/The-Complete-Guide-to-C-Strings-Part-I-Win32-Chara http://www.codeproject.com/Articles/3004/The-Complete-Guide-to-C-Strings-Part-II-String-Wra