如何附加wstring并将其写入文件

时间:2013-12-14 10:39:20

标签: c++ wstring

我已经尝试了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;}
   }}

1 个答案:

答案 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个对象的类型。

了解有关以null结尾的字符串的更多信息

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'元素。

了解有关TCHAR

的更多信息

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
  • 因此,调用sizeof(cFileName)将为您提供260(未定义_UNICODE时)或520(当定义_UNICODE时)

要获取由TCHAR组成的字符串的长度,您必须使用_tcslen宏。此宏扩展为strlenwcslen,具体取决于_UNICODE定义。

您必须知道大小为260 的数组cFileName意味着您的字符串具有相同的长度。 cFileName存储一个C风格的字符串(不管_UNICODE),意味着它以数组中的元素终止。

如果您想避免使用unicode,请确保在包含_UNICODE之前未定义windows.h。您也可以通过将字符集设置为“未设置”来实现此目的,如文章中所示。

使用TCHAR可以更轻松地编译同一程序的unicode和非unicode版本,只需切换一个定义。

wchar_tchar字符串之间的转换: 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