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

How to Append wstring and write it to a file

本文关键字:文件 何附加 wstring      更新时间:2023-10-16

我一直在尝试 1 小时来寻找解决方案,但没有任何效果。我正在使用FindFirstFile函数来获取文件/文件夹的列表。这部分工作正常,但是当我尝试使用它的cFilename时,它给出了一个字符串,几乎无用。我试图将其转换为字符以写入文件,它给了我错误。我试图将 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;}
   }}

修复

// 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("rn"), 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是以 null 结尾的字符串。例如,当 TCHAR char(未定义_UNICODE(时,字符串"Hello"在内存中如下所示:

['H','e','l','l','o', '', ...]

在这里,每个元素占用一个字节,...可以是任何垃圾。 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
  • 定义_UNICODETCHAR wchar_t(2 个字节(
  • 定义_UNICODE时,TCHAR char(1 字节(。
  • MAX_PATH定义为260
  • 因此,调用 sizeof(cFileName( 将给你 260(当未定义_UNICODE时(或 520(当定义_UNICODE时(

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

您必须知道数组大小为 260 cFileName并不意味着字符串具有相同的长度。 cFileName存储一个 C 样式的字符串(无论_UNICODE如何(,这意味着它以数组中的元素终止。

如果要避免使用 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-Charahttp://www.codeproject.com/Articles/3004/The-Complete-Guide-to-C-Strings-Part-II-String-Wra