【问题标题】:How to Append wstring and write it to a file如何附加 wstring 并将其写入文件
【发布时间】:2013-12-14 10:39:19
【问题描述】:

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

【问题讨论】:

  • 请发布一个完整的可构建示例来演示该问题,然后我将能够为您提供更多帮助。

标签: c++ wstring


【解决方案1】:

修复

// 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 是一个以 null 结尾的字符串。例如,当 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
  • _UNICODE 被定义时,TCHARwchar_t(2 个字节)
  • _UNICODE定义时,TCHARchar(1 个字节)。
  • MAX_PATH 定义为 260
  • 因此调用 sizeof(cFileName) 将为您提供 260(未定义 _UNICODE 时)或 520(定义 _UNICODE 时)

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

您必须知道数组cFileName 的大小为260 并不意味着您的字符串具有相同的长度。 cFileName 存储一个 C 风格的字符串(与 _UNICODE 无关),这意味着它以数组中的 zero 元素结束。

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

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

【讨论】:

  • 我已经在我的程序中将文件作为目录内容打开了,这只是我的代码的sn-p。
猜你喜欢
  • 2011-05-02
  • 2013-05-22
  • 2019-03-29
  • 2017-10-22
  • 2012-07-27
  • 1970-01-01
  • 1970-01-01
  • 2017-12-30
  • 1970-01-01
相关资源
最近更新 更多