2014-03-01 178 views
2

我写了一个程序,我在一个结构中存储文件名列表,我必须将它打印在一个文件中。文件名的类型在LPCWSTR中,并且只用文件名地址打印如果使用ofstream类。我也尝试过使用wofstream,但它导致“在阅读位置访问冲突”。我搜索网站以缓解此问题,但无法获得适当的解决方案。许多建议尝试使用wctombs函数,但我无法理解将LPCWSTR打印到文件是如何有用的。请帮助我缓解这种情况。打印LPCWSTR字符串到文件

我的代码是这样的,

ofstream out; 
out.open("List.txt",ios::out | ios::app); 
    for(int i=0;i<disks[data]->filesSize;i++) 
        { 
         //printf("\n%ws",disks[data]->lFiles[i].FileName); 
         //wstring ws = disks[data]->fFiles[i].FileName; 
         out <<disks[data]->fFiles[i].FileName << "\n"; 
        } 
        out.close(); 
+0

我不应该['std :: owfstream'](http://en.cppreference.com/w/cpp/io/bas ic_ofstream),标准输出文件流的'wchar_t'版本并实现为'basic_ofstream ',会给你带来你想要的吗?从技术上讲,“正确的”是转换,但它可能已经足够。 – WhozCraig

+0

@ WhozCraig ..请告诉我如何转换或类型转换或其他? – WarriorPrince

+0

[将C++ LPCWSTR打印到文件]的可能重复(http://stackoverflow.com/questions/716653/printing-a-c-lpcwstr-to-a-file) –

回答

3

如果你想转换,然后这应该工作(我无法得到wcstombs工作):

#include <fstream> 
#include <string> 
#include <windows.h> 

int main() 
{ 
    std::fstream File("File.txt", std::ios::out); 

    if (File.is_open()) 
    { 
     std::wstring str = L"русский консоли"; 

     std::string result = std::string(); 
     result.resize(WideCharToMultiByte(CP_UTF8, 0, str.c_str(), -1, NULL, 0, 0, 0)); 
     char* ptr = &result[0]; 
     WideCharToMultiByte(CP_UTF8, 0, str.c_str(), -1, ptr, result.size(), 0, 0); 
     File << result; 
    } 
} 

使用原始字符串(因为评论抱怨我使用std::wstring):

#include <fstream> 
#include <windows.h> 

int main() 
{ 
    std::fstream File("File.txt", std::ios::out); 

    if (File.is_open()) 
    { 
     LPCWSTR wstr = L"русский консоли"; 
     LPCSTR result = NULL; 

     int len = WideCharToMultiByte(CP_UTF8, 0, wstr, -1, NULL, 0, 0, 0); 

     if (len > 0) 
     { 
      result = new char[len + 1]; 
      if (result) 
      { 
       int resLen = WideCharToMultiByte(CP_UTF8, 0, wstr, -1, &result[0], len, 0, 0); 

       if (resLen == len) 
       { 
        File.write(result, len); 
       } 

       delete[] result; 
      } 
     } 
    } 
}