【问题标题】:Using CStdioFile for writing string使用 CStdioFile 写入字符串
【发布时间】:2016-03-29 15:02:38
【问题描述】:

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

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。谁能解开这个谜?

【问题讨论】:

  • 试试outputFile.WriteString(CString(s.c_str())); CString 有内置转换器到/从Unicode

标签: c++ string mfc cfile


【解决方案1】:

新的 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);

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-11-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-02-27
    • 2022-01-22
    • 2020-10-27
    相关资源
    最近更新 更多