2016-03-29 1 views
1

Я хочу записать данные, хранящиеся в векторе, в файл. Поэтому я использую следующую рутину:Использование CStdioFile для записи строки

bool Grid::saveToFile() { 
    stringstream sstream; 
    for (size_t i = 0; i < taglist.size(); ++i) 
    { 
     if (i != 0) 
      sstream << ","; 
     sstream << taglist[i]; 
    } 
    string s = sstream.str(); 

    CFileDialog FileDlg(FALSE); 

    if (FileDlg.DoModal() == IDOK) { 
     CString pathName = FileDlg.GetPathName(); 
     CStdioFile outputFile(pathName, CFile::modeWrite | CFile::modeCreate); 
     outputFile.WriteString((LPCTSTR)s.c_str()); 
     outputFile.Close(); 
     return TRUE; 
    } 

    return FALSE; 
} 

Проблема заключается в том: Несмотря на то, что есть данные в секундах, выходной файл всегда NULL. Может ли кто-нибудь решить эту тайну?

+0

Try 'outputFile.WriteString (CString (с. c_str())); 'CString имеет встроенные преобразователи в/из Unicode – cha

ответ

1

Новые проекты MFC создаются как Unicode, поэтому я предполагаю, что это Unicode.

Также ваше использование (LPCTSTR) предполагает, что вы получаете сообщение об ошибке, и вы пытаетесь исправить путем литья (она не работает)

Вы должны создать файл в Unicode, и использовать широкие строки std:: функции, такие как std::wstring или std::wstringstream

Пример:

CStdioFile f(L"test.txt", 
    CFile::modeWrite | CFile::modeCreate | CFile::typeUnicode); 

std::wstringstream ss; 
ss << L"Test123\r\n"; 
ss << L"ελληνικά\r\n"; 

f.WriteString(ss.str().c_str()); 

Редактировать

Кстати, вы также можете использовать std::wofstream с pubsetbuf писать непосредственно на поток в Unicode

std::wofstream fout(L"test.txt", std::ios::binary); 
wchar_t buf[128]; 
fout.rdbuf()->pubsetbuf(buf, 128); 
fout << L"Test1234, "; 
fout << L"ελληνικά, "; 

И точно так же использовать std::wifstream открыть потока

std::wifstream fin(L"test.txt", std::ios::binary); 
wchar_t buf[128]; 
fin.rdbuf()->pubsetbuf(buf, 128); 
+0

отлично! благодаря! – Michen