使用 CStdioFile 写入字符串

Using CStdioFile for writing string

我想将存储在向量中的数据写入文件。因此我使用以下例程:

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;
}

问题是:虽然s里面有数据,但是输出文件总是NULL。谁能解开这个谜?

新的 MFC 项目创建为 Unicode,所以我假设这是 Unicode。

此外,您对 (LPCTSTR) 的使用表明您遇到了错误,您尝试通过强制转换来修复(它不起作用)

您应该将文件创建为 Unicode,并使用宽字符串 std:: 函数,例如 std::wstringstd::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::wofstreampubsetbuf直接写入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);