不要再纠结在Unicode下含有CString的结构体CFile文件的输入输出了

论坛 期权论坛 编程之家     
选择匿名的用户   2021-5-22 16:42   26   0
文件读取成功
对于CString类 这是没法读取的因为无法确定它的大小, 所以一定要避免使用CString存取字符串
对于习惯了vc6.0 在使用vs时,难免会遇到多字节码与统一码转换的困扰
特别是在对文件读写时,这时我们不要去纠结这个,转换肯定会出问题的。
但是微软肯定会想到,所以设计了使wchar_t与char对应 为了移植不出现问题
我建议使用TCHAR 对于字符串建议用_T而不要用L,养成一个好的习惯。


定义的结构体
struct SUser
{
TCHAR sName[20];
TCHAR sPass[10];
TCHAR sPrior[10];
};

退出时写入文件
void CPriorDlg::OnDestroy()
{
CDialog::OnDestroy();
SUser u;
memset(u.sName,_T('\0'),sizeof(u.sName));
memset(u.sPass,_T('\0'),sizeof(u.sPass));
memset(u.sPrior,_T('\0'),sizeof(u.sPrior));
CFile file;
if(!file.Open(_T("./User.txt"),CFile::modeCreate|CFile::modeWrite))
return;
CListCtrl* pList = (CListCtrl*)GetDlgItem(IDC_PRIOR_LIST);
int i = 0,nCount = pList->GetItemCount();
while(i < nCount)
{
pList->GetItemText(i,0,u.sName,sizeof(u.sName));
pList->GetItemText(i,1,u.sPass,sizeof(u.sPass));
pList->GetItemText(i,2,u.sPrior,sizeof(u.sPrior));
file.Write(&u,sizeof(u));
i++;
}
file.Close();
}


启动时读入文件
BOOL CPriorDlg::OnInitDialog()
{


CDialog::OnInitDialog();
CListCtrl* pList = (CListCtrl*)GetDlgItem(IDC_PRIOR_LIST);
pList->InsertColumn(0,_T("用户名"),0,150);
pList->InsertColumn(1,_T("密码"),0,150);
pList->InsertColumn(2,_T("权限"),0,120);


CComboBox* pCombo = (CComboBox*)GetDlgItem(IDC_PRIOR_COMBO);
pCombo->AddString(_T("普通"));
pCombo->AddString(_T("高级"));
pCombo->SetCurSel(0);

ReadUsers(pList);
return TRUE;
}
void CPriorDlg::ReadUsers(CListCtrl* pList)
{

CFile file;
SUser u;
//file.Open(L"./User.dat",CFile::modeRead);
if(!file.Open(_T("./User.txt"),CFile::modeRead))
{
AfxMessageBox(_T("failed open file User.dat"));
return;
}


int i = 0;
while(file.Read(&u,sizeof(u)) > 0)
{
CString str;
str.Format(_T("用户名:%s 密码:%s 权限: %s"),u.sName,u.sPass,u.sPrior);
AfxMessageBox(str);
pList->InsertItem(i,u.sName);
pList->SetItemText(i,1,u.sPass);
pList->SetItemText(i,2,u.sPrior);
i++;
}
file.Close();
}
分享到 :
0 人收藏
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

积分:3875789
帖子:775174
精华:0
期权论坛 期权论坛
发布
内容

下载期权论坛手机APP