使用 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::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);
我想将存储在向量中的数据写入文件。因此我使用以下例程:
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::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);