直接在 swscanf 中使用 CString 的奇怪行为
Strange behavior using CString in swscanf directly
我对 CString
和 STL
的 set
有一个问题。
CString
和 STL
一起使用看起来有点奇怪,但我试图好奇。
我的代码如下:
#include "stdafx.h"
#include <iostream>
#include <set>
#include <atlstr.h>
using namespace std;
int _tmain(int argc, _TCHAR* argv[])
{
wchar_t line[1024] = {0};
FILE * pFile = _wfopen(L"F:\test.txt", L"rt");
set<CString> cstr_set;
while (fgetws(line, 1024, pFile))
{
CString cstr;
swscanf(line, L"%s\n", cstr);
cstr_set.insert(cstr);
}
fclose(pFile);
cout << "count" << cstr_set.size();
return 0;
}
test.txt
的内容是:
13245
123
2344
45
循环结束后,cstr_set
只包含一个值。
它的工作原理就好像 cstr
是静态变量或常量变量。
有什么问题?
CString
是一个 Microsoft 实现,将字符数组包装到 C++ 对象中以允许更简单的处理。
但是, swscanf
是一个很好的旧 C 函数,它对 CString 是什么一无所知:它只是期望它的参数足够大以接受解码值。它永远不应该直接传递 CString。
正确的方法是:
...
#include <cstring>
...
while (fgetws(line, 1024, pFile))
{
line[wcscspn(line, L"\n")] = 0; // remove an optional end of line
CString cstr(line);
cstr_set.insert(cstr);
}
...
我对 CString
和 STL
的 set
有一个问题。
CString
和 STL
一起使用看起来有点奇怪,但我试图好奇。
我的代码如下:
#include "stdafx.h"
#include <iostream>
#include <set>
#include <atlstr.h>
using namespace std;
int _tmain(int argc, _TCHAR* argv[])
{
wchar_t line[1024] = {0};
FILE * pFile = _wfopen(L"F:\test.txt", L"rt");
set<CString> cstr_set;
while (fgetws(line, 1024, pFile))
{
CString cstr;
swscanf(line, L"%s\n", cstr);
cstr_set.insert(cstr);
}
fclose(pFile);
cout << "count" << cstr_set.size();
return 0;
}
test.txt
的内容是:
13245
123
2344
45
循环结束后,cstr_set
只包含一个值。
它的工作原理就好像 cstr
是静态变量或常量变量。
有什么问题?
CString
是一个 Microsoft 实现,将字符数组包装到 C++ 对象中以允许更简单的处理。
但是, swscanf
是一个很好的旧 C 函数,它对 CString 是什么一无所知:它只是期望它的参数足够大以接受解码值。它永远不应该直接传递 CString。
正确的方法是:
...
#include <cstring>
...
while (fgetws(line, 1024, pFile))
{
line[wcscspn(line, L"\n")] = 0; // remove an optional end of line
CString cstr(line);
cstr_set.insert(cstr);
}
...