mfc 读取大数据 (txt文件)显示 3C

文件格式是这样的:
dfd,afa,afa,234,r3r,d2ed,2d,3d2,d2d,2de,
dfa,fdsf,sa,dfdsf,sds,ddf,sdf,dsd,dfd,dfd,
......
数据间用,隔开
//list control 的初始化
CListCtrl* pmyListCtrl = (CListCtrl*)GetDlgItem(IDC_LIST1);
DWORD dwStyle = GetWindowLong(pmyListCtrl->m_hWnd, GWL_STYLE);
SetWindowLong( pmyListCtrl->m_hWnd, GWL_STYLE, dwStyle | LVS_REPORT);
DWORD styles = pmyListCtrl->GetExtendedStyle();
pmyListCtrl->SetExtendedStyle(styles|LVS_EX_FULLROWSELECT|LVS_EX_GRIDLINES);
TCHAR rgtsz[10][20] = {_T("port"),_T("mm:ss.ms_us_ns"),_T("Delta Time"),_T("Icon"),_T("SOF"),_T("数量"),_T("Bytes"),_T(""),_T("CRC"),_T("")}
LV_COLUMN lvcolumn;
CRect rect;
pmyListCtrl->GetWindowRect(&rect);
for (int i=0;i {
lvcolumn.mask = LVCF_FMT | LVCF_SUBITEM | LVCF_TEXT
| LVCF_WIDTH | LVCF_ORDER;
lvcolumn.fmt = LVCFMT_LEFT;
lvcolumn.pszText = rgtsz[i];
lvcolumn.iSubItem = i;
lvcolumn.iOrder = i;
lvcolumn.cx = rect.Width()/10;
pmyListCtrl->InsertColumn(i, &lvcolumn);
}
我现在是用CStdioFile实现按行读,file.Open((resultFileName),CFile::modeRead);打开要读取的文件,resultFileName是存放路径的字符串,然后用
pos=s.Find(L",");

s1=s.Left(pos);

s=s.Right(s.GetLength()-pos-1);

pos=s.Find(L",");

s2=s.Left(pos);

s=s.Right(s.GetLength()-pos-1);
......
m_list.InsertItem(n,s1);

m_list.SetItemText(n,1,s2);
......
这样的方式来插入数据,显示到list control里面

测试文件只有几百行的话读得很快,现在用5000行来测已经有2s左右的延迟了,那要是几百万,上千万行数据要怎么读取,虚拟列表或者内存映射要怎么弄,新学的mfc,很多东西都不太了解,希望能讲的详细点,谢谢!

3个回答

这么多数据,就别插入到列表中了
只需要,显示用到的部分,加载到内存,用不到的保存在文件中,采用内存映射方式读取

chenxiaohua1994
伊利低乳糖 有具体的例子么,内存映射不太懂,不插入列表的话,显示出来的样子是一样的么,如果要读取其中某一行的某个字段内容的话,怎么办
大约 4 年之前 回复

平常所用到的列ListView/ListCtrl控件,都是只有行至几百行数据,直至今日,在项目中遇到了上10W量级数据条,终于感觉到普通加载的艰辛,遂到网上乱找一通,发现大同小异,转载了这篇比较详细的,后面代码所用到的m_Items,为存放的列表的数据结构列表,

这篇文章虽详尽,改日做一个DEMO,

Demo

一、什么是虚拟列表控件

虚拟列表控件是指带有LVS_OWNERDATA风格的列表控件。。

二、为什么使用虚拟列表控件

我们知道,通常使用列表控件CListCtrl,需要调用InsertItem把要显示的数据插入列表中,之后我们就不必关心数据在哪里了,这是因为控件自己开辟了内存空间来保存这些数据。现在假设我们要显示一个数据库,里面的信息量很大,有几十万条记录。通常有两种方法解决这个问题:1是仅仅在ListCtrl中插入少量的数据,比如100个,然后通过[上一页][下一页]两个按钮进行控制,某一时刻显示的只是从xxx到xxx+100之间的记录。2是把所有数据全部插入到ListCtrl中,然后让用户通过滚动来查看数据。无疑,很多用户喜欢采用第二种方式,特别是对于已经排序的数据,用户只需用键盘输入某行的开头字符,就可以快速定位到某一行。但是,如果这样做,InsertItem插入数据的过程将是很漫长的,而且用户会看到ListCtrl刷新速度也很慢,而且所有数据都位于内存中消耗了大量的内存,当数据多达上万以后几乎是不能忍受的。

为此,mfc特别提供了虚拟列表的支持。一个虚拟列表看起来和普通的ListCtrl一样,但是不用通过InsertItem来插入数据,它仅仅知道自己应该显示多少数据。但是它如何知道要显示什么数据呢?秘密就在于当列表控件需要显示某个数据的时候,它向父窗口要。假设这个列表控件包含100个元素,第10到20个元素(行)是可见的。当列表控件重画的时候 ,它首先请求父窗口给它第10个元素的数据,父窗口收到请求以后,把数据信息填充到列表提供的一个结构中,列表就可以用来显示了,显示第10个数据后,列表会继续请求下一个数据。

在虚拟的样式下,ListCtrl可以支持多达DWORD个数据项。(缺省的listctrl控件最多支持int个数据项)。但是,虚拟列表的最大优点不在于此,而是它仅仅需要在内存中保持极少量的数据,从而加快了显示的速度。所以,在使用列表控件显示一个很大的数据库的情况下,采用虚拟列表最好不过了。

不仅CListCtrl提供虚拟列表的功能, MFC的CListView类也有同样的功能。

三、虚拟列表控件的消息

虚拟列表总共发送三个消息给父窗口:当它需要数据的时候,它发送LVN_GETDISPINFO消息。这是最重要的消息。当用户试图查找某个元素的时候,它发送LVN_ODFINDITEM消息;还有一个消息是LVN_ODCACHEHINT,用来缓冲数据,基本上很少用到这个消息。

虚拟列表控件使用起来非常简单。它总共只有三个相关的消息,如果你直接使用CListCtrl,应该在对话框中响应这三个消息。如果你使用CListCtrl派生类,可以在派生类中响应这三个消息的反射消息。这三个消息分别是:

(1)LVN_GETDISPINFO 控件请求某个数据
(2)LVN_ODFINDITEM 查找某个数据
(3)LVN_ODCACHEHINT 缓冲某一部分数据

我们必须响应的消息是(1),多数情况下要响应(2),极少数的情况下需要响应(3)

四、如何使用虚拟列表控件

1、首先要创建控件,创建一个虚拟列表和创建一个正常的 CListCtrl差不多。先在资源编辑器里面添加一个list control资源。然后选中"Owner data"属性,然后给它捆绑一个CListCtrl变量。添加列,添加imagelist等都和使用正常的listctrl一样。

2、给虚拟列表添加元素。假设 m_list 是这个列表的控制变量。通常的情况下这样添加数据:

m_list.InsertItem(0, _T("Hello world"));

但是对于虚拟列表,不能这么做。只需告诉列表有多少个数据:

//总共显示100行
m_list.SetItemCount(100);

3、处理它的通知消息。

五、如何响应虚拟列表的消息

1、处理 LVN_GETDISPINFO 通知消息

当虚拟列表控件需要某个数据的时候,它给父窗口发送一个 LVN_GETDISPINFO通知消息,表示请求某个数据。因此列表的所有者窗口(或者它自己)必须处理这个消息。例如派生类的情况 (CMyListCtrl是一个虚拟列表类对象):

//这里处理的是反射消息
BEGIN_MESSAGE_MAP(CMyListCtrl, CListCtrl)
//{{AFX_MSG_MAP(CMyListCtrl)
ON_NOTIFY_REFLECT(LVN_GETDISPINFO, OnGetdispinfo)
//}}AFX_MSG_MAP
END_MESSAGE_MAP()

在LVN_GETDISPINFO的处理函数中,必须首先检查列表请求的是什么数据,可能的值包括:

(1)LVIF_TEXT 必须填充 pszText
(2)LVIF_IMAGE 必须填充 iImage
(3)LVIF_INDENT 必须填充 iIndent
(4)LVIF_PARAM 必须填充 lParam
(5)LVIF_STATE 必须填充 state

根据它的请求,填充所需的数据即可。

//================= 例子代码=====================================

下面的给出一个例子,填充的是列表所需的某个数据项的文字以及图像信息:

LV_DISPINFO* pDispInfo = (LV_DISPINFO*)pNMHDR;
LV_ITEM* pItem= &(pDispInfo)->item;

int iItemIndx= pItem->iItem;

if (pItem->mask & LVIF_TEXT) //字符串缓冲区有效
{
switch(pItem->iSubItem){
case 0: //填充数据项的名字
lstrcpy(pItem->pszText,m_Items[iItemIndx].m_strItemText);
break;
case 1: //填充子项1
lstrcpy(pItem->pszText,m_Items[iItemIndx].m_strSubItem1Text);
break;
case 2: //填充子项2
lstrcpy(pItem->pszText,m_Items[iItemIndx].m_strSubItem2Text);
break;
}
}
/*注意,多数情况下要使用lstrcpyn ,因为最多复制字符的个数由pItem->cchTextMax给出:
lstrcpyn(pItem->pszText, text, pItem->cchTextMax);
*/

if (pItem->mask & LVIF_IMAGE) //是否请求图像
pItem->iImage= m_Items[iItemIndx].m_iImageIndex;

甚至连某行数据是否选中(当有checkbox的情况下)的信息也需要由用户自己来维护,例如:
//是否显示该行的选择信息?
if(IsCheckBoxesVisible()) //自定义函数
{
pItem->mask |= LVIF_STATE;
pItem->stateMask = LVIS_STATEIMAGEMASK;

if(m_database[itemid].m_checked)
{
     pItem->state = INDEXTOSTATEIMAGEMASK(2);
}
else
{
     pItem->state = INDEXTOSTATEIMAGEMASK(1);
 }

}

2、处理 LVN_ODFINDITEM 消息

在资源管理器里面,定位到某个文件夹,会显示很多文件,如果按下键盘的‘A’,则资源管理器会自动找到名字以 'A'打头的文件夹或者文件, 并选择该文件。继续按 A,如果还有其它名字以'A'打头的文件,则下一个文件被选中。如果输入 "AB",则 'AB'打头的文件被选中。这就是列表控件的自动查找功能。

当虚拟列表收到一个LVM_FINDITEM消息,它也会发送这个消息通知父窗口查找目标元素。要搜索的信息通过 LVFINDINFO 结构给出。它是 NMLVFINDITEM 结构的一个成员。当找到要搜索的数据后,应该把该数据的索引(行号)返回,如果没有找到,则返回-1。

以对话框为例,响应函数大致如下:

//================= 例子代码=====================================
void CVirtualListDlg::OnOdfinditemList(NMHDR* pNMHDR, LRESULT* pResult)
{
// pNMHDR 里面是要查找的元素的信息
// 要选中的目标元素的行号最后要保存在 pResult 中, 这是关键!

NMLVFINDITEM* pFindInfo = (NMLVFINDITEM*)pNMHDR;


/* pFindInfo->iStart 是查找的起始位置,一直到最后,然后从头开始,如果没有找到合适的,最终停留在iStart*/


*pResult = -1;


//是否按照文字查找?
if( (pFindInfo->lvfi.flags & LVFI_STRING) == 0 )
{
    return;
}


//这是我们要找的字符串
CString searchstr = pFindInfo->lvfi.psz;


int startPos = pFindInfo->iStart;//保存起始位置


//判断是否最后一行
if(startPos >= m_list.GetItemCount())
    startPos = 0;


int currentPos=startPos;

//开始查找
do
{        
    if( _tcsnicmp(m_database[currentPos].m_name, 
             searchstr, searchstr.GetLength()) == 0)
    {
        //选中这个元素,停止查找
        *pResult = currentPos;
        break;
    }


    currentPos++;


    //从头开始
    if(currentPos >= m_list.GetItemCount())
        currentPos = 0;


}while(currentPos != startPos);        

}

显然,如果数据很多,必须实现一个快速查找的方法。

关于pFindInfo->lvfi里面的信息的详细说明可以参考 MSDN。

3、处理 LVN_ODCACHEHINT 消息。

假如我们从数据库或者其它地方读取数据的速度比较慢,则可以利用这个消息,批量读取一些数据,然后根据请求,逐个提供给虚拟列表。LVN_ODCACHEHINT消息的用途就是给程序一个缓冲数据的机会。以提高程序的性能。

//================= 例子代码=====================================
使用 ClassWizard 重载 OnChildNotify 函数,检查是否 LVN_ODCACHEHINT 消息,然后准备缓冲数据:

NMLVCACHEHINT* pcachehint=NULL;

NMHDR* phdr = (NMHDR*)lParam;

if(phdr->code == LVN_ODCACHEHINT)
{
pcachehint= (NMLVCACHEHINT*) phdr;
//自定义函数,准备指定范围的数据到缓冲区
PrepCache(pcachehint->iFrom, pcachehint->iTo);
}
else ...

注意,如果消息不是 LVN_ODCACHEHINT,则要传递给基类进行处理。

五、如何修改ListCtrl显示的数据。

由于是程序自己维护数据,所以只需修改数据库中的数据,然后调用CListCtrl::RedrawItems函数进行重画即可。

六、数据的选择状态和选择框

CListCtrl可以显示checkbox选择框。有些情况下是很有用的。对于正常的listctrl,用户可以用鼠标来修改某个元素的选择状态,但是对于虚拟列表就不行了。必须自己处理一些消息,然后自己保存数据的选中状态:

void CVirtualListDlg::ToggleCheckBox(int item)
{
m_database[item].m_checked = !m_database[item].m_checked;
m_list.RedrawItems(item, item);
}

处理 LVN_KEYDOWN消息,添加对空格键 的响应,用于切换选择状态:

void CVirtualListDlg::OnKeydownList(NMHDR* pNMHDR, LRESULT* pResult)
{
LV_KEYDOWN* pLVKeyDown = (LV_KEYDOWN*)pNMHDR;

if( pLVKeyDown->wVKey == VK_SPACE )
{
   int item = m_list.GetSelectionMark();
    if(item != -1)
        ToggleCheckBox(item);
}


*pResult = 0;

}

然后处理 NM_CLICK 消息:

void CVirtualListDlg::OnClickList(NMHDR* pNMHDR, LRESULT* pResult)
{
NMLISTVIEW* pNMListView = (NM_LISTVIEW*)pNMHDR;

LVHITTESTINFO hitinfo;
hitinfo.pt = pNMListView->ptAction;


int item = m_list.HitTest(&hitinfo);


if(item != -1)
{
    //看看鼠标是否单击在 check box上面了?
    if( (hitinfo.flags & LVHT_ONITEMSTATEICON) != 0)
    {
        ToggleCheckBox(item);
    }
}

*pResult = 0;

}

七、备注:

1、虚拟列表无法进行排序。


2、虚表的一个优点是容易保持和数据库的同步。修改数据库中的数据,然后重画list十分容易而且高效。


3、虚表的另一个优点是可以根据需要产生数据。比如在某一列加上行号。
chenxiaohua1994
伊利低乳糖 这文章我看过,没太看懂,你能结合我的例子解释一下么,不插入列表的话,它的显示是什么样子的
大约 4 年之前 回复

就是不要一次加载全部数据到listcontrol中,只显示一部分,然后根据滚动条位置来加载需要显示的

lx624909677
lx624909677 回复伊利低乳糖: 在添加之前listctrl.SetRedraw(FALSE);全部添加完后listctrl.SetRedraw(TRUE);listctrl.Invalidate();或者重载ScollBar,然后通过ScollBar的滚动来触发ListControl的翻页。不过最好做成分页
大约 4 年之前 回复
chenxiaohua1994
伊利低乳糖 具体要怎么实现呢,CreateFile,CreateFileMapping之类的不是很清楚怎么用,而且创建映射后怎么来读取文件并显示呢,能不能给个具体代码说明一下
大约 4 年之前 回复
Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
其他相关推荐
MFC读取txt文件内容的问题

我把读取文件的代码写在Dlg的OnInitDialog()函数里 当那个data文件只有一行的时候读取文件是可以正常运行的,只在后面有问题。 但data文件有两行的话就会停在getdata函数这里 CStringData* GetData() const throw() { return( reinterpret_cast< CStringData* >( m_pszData )-1 ); } 读文件代码如下: ``` CStdioFile myFile; CFileException fileException; if (myFile.Open(_T("data.txt"), CFile::typeText | CFile::modeReadWrite), &fileException) { myFile.SeekToBegin(); CString str; while (myFile.ReadString(str)){ single* fi = new single(); int sec = 0; CString p; for (int i = 0; i < str.GetLength(); i++){ if (str[i] == ','){ if (sec == 0) //单号 fi->setNum(p); else if (sec == 1){ if (p == "0") fi->setCategory(0); else fi->setCategory(1); } else if (sec == 2) fi->setSendAddr(p); else if (sec == 3) fi->setSendPhone(p); else if (sec == 4) fi->setSendNote(p); else if (sec == 5) fi->setReceiveAddr(p); else if (sec == 6) fi->setReceivePhone(p); else if (sec == 7) fi->setReceiveNote(p); else if (sec == 8) fi->setSendDate(p); else if (sec == 9) fi->setReceiveDate(p); else if (sec == 10){ if (p == "0") fi->setReceived(false); else fi->setReceived(1); } else if (sec == 11){ if (p == "0") fi->setUnknow(0); else fi->setUnknow(1); } else if (sec == 12){ int num = _ttoi(p); fi->setUnknowNote(num); } else{ double mon = _wtof(p); fi->setMoney(mon); sec = -1; } p = ""; sec++; } else p += str[i]; } tree->insert(fi); } } else { TRACE("Can't open file %s,error=%u\n", _T("data.txt"), fileException.m_cause); } myFile.Close(); ``` 求指教,这样写哪里有错吗?

MFC 如何将读取txt文件的数据并显示在list列表中?

![![![图片说明](https://img-ask.csdn.net/upload/201605/31/1464681638_273495.png)图片说明](https://img-ask.csdn.net/upload/201605/31/1464681616_27801.png)图片说明](https://img-ask.csdn.net/upload/201605/31/1464681611_212450.png) 怎么将图上的txt文件的数据 显示在list中

MFC 怎么从TXT文件里面读取数据并显示到list control中

要写一个通讯录管理系统,txt里面存放联系人的信息,但是要怎么显示到list control里面啊

mfc读取TXT文件坐标点绘图

新手,请大家多多帮助,如何用读取txt中的坐标点,并在窗口上顺次连接这些点,绘制成线。

MFC读取文件出现乱码问题

定义了一个结构体,存储管理员信息。现在文件中存在两条记录,想读取,显示在编辑框中,却出现了乱码,该如何解决? 代码如下: ``` ADMINSTRATORLIST adm; //memset(&adm,0,sizeof(adm)); CFile file; try { file.Open(_T("管理员信息.txt"),CFile::modeRead|CFile::modeCreate| CFile::modeNoTruncate); ADMINSTRATORLIST adm; file.Read(&adm,sizeof(ADMINSTRATORLIST)); //从文件中读一条记录 } catch ( CFileException e) { e.ReportError(); } file.Close(); m_AdmID=adm.AdmID; m_AdmName=adm.AdmName; m_AdmGender=adm.AdmGender; m_AdmAge=adm.AdmAge; UpdateData(false); return TRUE; // return TRUE unless you set the focus to a control // 异常: OCX 属性页应返回 FALSE ``` 注:经过查询,用memset()函数初始化结构体,所以文件中保存的记录并无乱码。但是显示在编辑框中的是乱码“烫烫烫烫烫烫”。 txt文件如下: ``` 001 梁朝伟 男 28 002 刘德华 男 30 ``` 请问该如何解决?

MFC读取文件中的jpg图片如何显示

MFC读取文件中的jpg图片如何显示?希望有简单的方法,网上看到的都比较乱。

求助 基于mfc的对话框如何显示读取txt文件 并放入不同数组

![图片说明](https://img-ask.csdn.net/upload/201907/08/1562578010_128474.png)![图片说明](https://img-ask.csdn.net/upload/201907/08/1562578017_987359.png) 要求点击左边按钮 按钮ID读取文件 在右边控件遍历输出 最好能有详细代码 数组1[100,120,120,122,121,564] 数组2[201,203,123,121,144,675] ``` CFileDialog fileDlg(TRUE); fileDlg.m_ofn.lpstrTitle = L"这是我的打开文件对话框"; fileDlg.m_ofn.lpstrFilter = L"Text Files(*.txt)\0*.txt\0All Files(*.*)\0*.*\0\0"; if(IDOK == fileDlg.DoModal()) { CStdioFile file(fileDlg.GetFileName(),CFile::modeRead); CString x[20],y[20]; CString strTemp; for (int i=0; file.ReadString(strTemp);i++) { x[i] = strTemp.Left(strTemp.Find('\t')); y[i] = strTemp.Trim(); } file.Close(); } ``我这样为什么不行啊

MFC怎么读取TXT中自己想要的数据

![图片说明](https://img-ask.csdn.net/upload/202001/14/1578977304_128472.png)![图片说明](https://img-ask.csdn.net/upload/202001/14/1578977315_361489.png) 我想要把初始化文件的数值填入到程序对应的EDIT控件中,现在只会读取文件但不会提取重要信息,求解答,谢谢

MFC获取txt文件大小问题

我要写出数据到txt文件中,当txt文件达到一定大小,比如说1M时,关闭当前文档,重新写入一个新的txt文档,应该用什么样的思路去实现呢?新手,求大神指教!

mfc读取TXT中的坐标点,并绘制成线

*/用什么方法能够实现MFC在txt中的数据坐标读取。 比如数据格式如下: x100 y300 x150 y200 x300 y100 如何读取并调用者3个点,连成线

英文操作系统中,MFC读取ini文件字符串,中文乱码!!?求助求助!

** 环境**:英文操作系统,win7-x64, vs2012,; ** 程序**:多字节的MFC,32位; **文件**:要读取的ini文件是Ansi编译环境的; ** 想实现的目标**:GetPrivateProfileString读取ini文件中的中文字符串; **具体代码如下**: GetPrivateProfileString( "SystemConfig", "CurProductFile", "", str.GetBuffer( 256 ), 256, path ); **要读取的INI文件中的内容**: [SystemConfig] CurProductFile=G:\我的文档\MyProject\Debug\ProductFiles\PCB1.dat **结果问题!!**:实际读取到的字符串结果str中,中文是乱码的! **乱码内容如下**: str = "G:\\ÎÒµÄÎĵµ\\MyProject\\Debug\\ProductFiles\\PCB1.dat" 中文都乱码了!崩溃了! **提示**:我尝试将str从Ansi转Unicode,vs中显示中文正确!!!why? CStringW strW; …… str 到 strW 的转化操作…… strW = L"G:\\我的文档\\MyProject\\Debug\\ProductFiles\\PCB1.dat" **环境语言设置**:已经将控制面板中的语言设置成中文支持的格式:如下图 ![图片说明](https://img-ask.csdn.net/upload/201810/29/1540818473_888606.png) ![图片说明](https://img-ask.csdn.net/upload/201810/29/1540818490_57315.jpg) ![图片说明](https://img-ask.csdn.net/upload/201810/29/1540818511_497041.png) **提问**:如何才能在英文操作系统中,多字节MFC程序中读取ini文件字符串,中文不乱码?或如何才能获取正常的多字节中文字符串?! 库存没有金币,欲哭无泪啊,虚心求教!!恳请高手指教!

MFC一次性读取一个文件中所有字符

我想一次性读取文件中的字符串,但是我读取的时候有问题,我的代码如下 ``` file.Open(filePath,CFile::modeRead|CFile::typeBinery){ char * A = new char[file.GetLength()]; file.Read(A,file.GetLength()); CString strResult(A); delete A; return strResult.AllocSysString(); } ``` 比如我文件内容是123456789,但是实际他显示123456789 乱码,就是说实际字符后面多了好多乱码和空格,请问这个怎么解决啊,求助啊

MFC 如何创建txt格式文件?

MFC 如何创建txt格式文件? 我需要创建一个空的文本文件 应该怎么弄? 最好能给出代码

MFC在UNICODE环境下,如何读取UNICODE编码形式的TXT文件?

m_Filename是文件名字所在的编辑框变量名 m_readandwrite是用来放读到的内容的编辑框变量名 因为我写入文件的编码形式是UNICODE,但是用读出文件的代码去读会乱码 读出文件的代码读ANSI不会出问题 所以想问怎么读UNICODE的TXT怎么读。。。。 下面是读ANSI的代码。。。 HANDLE handle = CreateFile(m_Filename, GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL); if (handle != INVALID_HANDLE_VALUE) { char read[1024]; DWORD nBytesRead = 0xFEFF; while (true) { UpdateData(true); ZeroMemory(read, 1024); BOOL bResult = ReadFile(handle, read, 1024, &nBytesRead, NULL); if (bResult && (nBytesRead == 0)) { break; } CString readstr(read); m_readandwrite.Format(readstr); UpdateData(false); } CloseHandle(handle);

MFC 如何读取UTF-8文件

项目是UNICODE的字符集,现在想读取UTF-8文件并显示UTF-8文件如何编写代码,请各位大神解答 最好具体详细点,本人菜鸟一枚

MFC一行一行读取txt文件中的x,y,z坐标,并且保存到三个数组中

我要用MFC实现数控仿真功能,大体上是一行一行读取txt文件中的x,y,z,然后保存到三个数组中以备后用,然后后期怎么画图也不知道还用什么?求指教。

C++/MFC 文本文件读取

由于电脑断电,文本文件异常保存,保存的文件如下:(图1为二进制,图二为 记事本) ![图片说明](https://img-ask.csdn.net/upload/201507/02/1435814100_57350.png) ![图片说明](https://img-ask.csdn.net/upload/201507/02/1435814136_99089.jpg) 文件表现中间出现 00, CStdioFile ReadString 时读到蓝色标记处,即 00 位置,认为文件已经结束,下面的内容无法读取,请问这种情况应如何处理!

MFC 读取文本内容的问题

``` void EditView::ReadTitle(CString strName) { CString content=""; CStdioFile file; CString fileName = strName; if (file.Open(fileName, CFile::modeRead | CFile::typeText)) { file.SeekToBegin(); CString str; int len = 512 - 2; file.ReadString(str); // A null character ('\0') is appended. if ("" != str) content += str; file.Close(); } else AfxMessageBox("读取失败!"); this->SetWindowText(content); } ``` strName是路径,调试是正确的,而且file.Open()也成功了。 就是读取内容ReadString(str)时,str显示字符串中的字符无效。 不知是哪里的问题。。

MFC逐行读取txt文件问题,为什么读取的数据都是0,代码如下,望大家解答

CString srcString; std::vector<PointF>m_curve; CStdioFile m_file(srcString,CFile::modeRead); CString strLine; while (m_file.ReadString(strLine)) { const char* filename = (const char *)strLine.GetBuffer(); float a = 0.f; float b = 0.f; sscanf_s(filename,"%f %f",&a,&b); m_curve.push_back(PointF(a,b)); } PointF是GDI+里面的结构体,为什么读取的行数是正确的,但是数据都是0

在中国程序员是青春饭吗?

今年,我也32了 ,为了不给大家误导,咨询了猎头、圈内好友,以及年过35岁的几位老程序员……舍了老脸去揭人家伤疤……希望能给大家以帮助,记得帮我点赞哦。 目录: 你以为的人生 一次又一次的伤害 猎头界的真相 如何应对互联网行业的「中年危机」 一、你以为的人生 刚入行时,拿着傲人的工资,想着好好干,以为我们的人生是这样的: 等真到了那一天,你会发现,你的人生很可能是这样的: ...

程序员请照顾好自己,周末病魔差点一套带走我。

程序员在一个周末的时间,得了重病,差点当场去世,还好及时挽救回来了。

我以为我学懂了数据结构,直到看了这个导图才发现,我错了

数据结构与算法思维导图

String s = new String(" a ") 到底产生几个对象?

老生常谈的一个梗,到2020了还在争论,你们一天天的,哎哎哎,我不是针对你一个,我是说在座的各位都是人才! 上图红色的这3个箭头,对于通过new产生一个字符串(”宜春”)时,会先去常量池中查找是否已经有了”宜春”对象,如果没有则在常量池中创建一个此字符串对象,然后堆中再创建一个常量池中此”宜春”对象的拷贝对象。 也就是说准确答案是产生了一个或两个对象,如果常量池中原来没有 ”宜春” ,就是两个。...

技术大佬:我去,你写的 switch 语句也太老土了吧

昨天早上通过远程的方式 review 了两名新来同事的代码,大部分代码都写得很漂亮,严谨的同时注释也很到位,这令我非常满意。但当我看到他们当中有一个人写的 switch 语句时,还是忍不住破口大骂:“我擦,小王,你丫写的 switch 语句也太老土了吧!” 来看看小王写的代码吧,看完不要骂我装逼啊。 private static String createPlayer(PlayerTypes p...

Linux面试题(2020最新版)

文章目录Linux 概述什么是LinuxUnix和Linux有什么区别?什么是 Linux 内核?Linux的基本组件是什么?Linux 的体系结构BASH和DOS之间的基本区别是什么?Linux 开机启动过程?Linux系统缺省的运行级别?Linux 使用的进程间通信方式?Linux 有哪些系统日志文件?Linux系统安装多个桌面环境有帮助吗?什么是交换空间?什么是root帐户什么是LILO?什...

将一个接口响应时间从2s优化到 200ms以内的一个案例

一、背景 在开发联调阶段发现一个接口的响应时间特别长,经常超时,囧… 本文讲讲是如何定位到性能瓶颈以及修改的思路,将该接口从 2 s 左右优化到 200ms 以内 。 二、步骤 2.1 定位 定位性能瓶颈有两个思路,一个是通过工具去监控,一个是通过经验去猜想。 2.1.1 工具监控 就工具而言,推荐使用 arthas ,用到的是 trace 命令 具体安装步骤很简单,大家自行研究。 我的使用步骤是...

学历低,无法胜任工作,大佬告诉你应该怎么做

微信上收到一位读者小涛的留言,大致的意思是自己只有高中学历,经过培训后找到了一份工作,但很难胜任,考虑要不要辞职找一份他能力可以胜任的实习工作。下面是他留言的一部分内容: 二哥,我是 2016 年高中毕业的,考上了大学但没去成,主要是因为当时家里经济条件不太允许。 打工了三年后想学一门技术,就去培训了。培训的学校比较垃圾,现在非常后悔没去正规一点的机构培训。 去年 11 月份来北京找到了一份工...

JVM内存结构和Java内存模型别再傻傻分不清了

JVM内存结构和Java内存模型都是面试的热点问题,名字看感觉都差不多,网上有些博客也都把这两个概念混着用,实际上他们之间差别还是挺大的。 通俗点说,JVM内存结构是与JVM的内部存储结构相关,而Java内存模型是与多线程编程相关,本文针对这两个总是被混用的概念展开讲解。 JVM内存结构 JVM构成 说到JVM内存结构,就不会只是说内存结构的5个分区,而是会延展到整个JVM相关的问题,所以先了解下

和黑客斗争的 6 天!

互联网公司工作,很难避免不和黑客们打交道,我呆过的两家互联网公司,几乎每月每天每分钟都有黑客在公司网站上扫描。有的是寻找 Sql 注入的缺口,有的是寻找线上服务器可能存在的漏洞,大部分都...

Google 与微软的浏览器之争

浏览器再现“神仙打架”。整理 | 屠敏头图 | CSDN 下载自东方 IC出品 | CSDN(ID:CSDNnews)从 IE 到 Chrome,再从 Chrome 到 Edge,微软与...

讲一个程序员如何副业月赚三万的真实故事

loonggg读完需要3分钟速读仅需 1 分钟大家好,我是你们的校长。我之前讲过,这年头,只要肯动脑,肯行动,程序员凭借自己的技术,赚钱的方式还是有很多种的。仅仅靠在公司出卖自己的劳动时...

上班一个月,后悔当初着急入职的选择了

最近有个老铁,告诉我说,上班一个月,后悔当初着急入职现在公司了。他之前在美图做手机研发,今年美图那边今年也有一波组织优化调整,他是其中一个,在协商离职后,当时捉急找工作上班,因为有房贷供着,不能没有收入来源。所以匆忙选了一家公司,实际上是一个大型外包公司,主要派遣给其他手机厂商做外包项目。**当时承诺待遇还不错,所以就立马入职去上班了。但是后面入职后,发现薪酬待遇这块并不是HR所说那样,那个HR自...

女程序员,为什么比男程序员少???

昨天看到一档综艺节目,讨论了两个话题:(1)中国学生的数学成绩,平均下来看,会比国外好?为什么?(2)男生的数学成绩,平均下来看,会比女生好?为什么?同时,我又联想到了一个技术圈经常讨...

搜狗输入法也在挑战国人的智商!

故事总是一个接着一个到来...上周写完《鲁大师已经彻底沦为一款垃圾流氓软件!》这篇文章之后,鲁大师的市场工作人员就找到了我,希望把这篇文章删除掉。经过一番沟通我先把这篇文章从公号中删除了...

85后蒋凡:28岁实现财务自由、34岁成为阿里万亿电商帝国双掌门,他的人生底层逻辑是什么?...

蒋凡是何许人也? 2017年12月27日,在入职4年时间里,蒋凡开挂般坐上了淘宝总裁位置。 为此,时任阿里CEO张勇在任命书中力赞: 蒋凡加入阿里,始终保持创业者的冲劲,有敏锐的...

总结了 150 余个神奇网站,你不来瞅瞅吗?

原博客再更新,可能就没了,之后将持续更新本篇博客。

副业收入是我做程序媛的3倍,工作外的B面人生是怎样的?

提到“程序员”,多数人脑海里首先想到的大约是:为人木讷、薪水超高、工作枯燥…… 然而,当离开工作岗位,撕去层层标签,脱下“程序员”这身外套,有的人生动又有趣,马上展现出了完全不同的A/B面人生! 不论是简单的爱好,还是正经的副业,他们都干得同样出色。偶尔,还能和程序员的特质结合,产生奇妙的“化学反应”。 @Charlotte:平日素颜示人,周末美妆博主 大家都以为程序媛也个个不修边幅,但我们也许...

MySQL数据库面试题(2020最新版)

文章目录数据库基础知识为什么要使用数据库什么是SQL?什么是MySQL?数据库三大范式是什么mysql有关权限的表都有哪几个MySQL的binlog有有几种录入格式?分别有什么区别?数据类型mysql有哪些数据类型引擎MySQL存储引擎MyISAM与InnoDB区别MyISAM索引与InnoDB索引的区别?InnoDB引擎的4大特性存储引擎选择索引什么是索引?索引有哪些优缺点?索引使用场景(重点)...

如果你是老板,你会不会踢了这样的员工?

有个好朋友ZS,是技术总监,昨天问我:“有一个老下属,跟了我很多年,做事勤勤恳恳,主动性也很好。但随着公司的发展,他的进步速度,跟不上团队的步伐了,有点...

我入职阿里后,才知道原来简历这么写

私下里,有不少读者问我:“二哥,如何才能写出一份专业的技术简历呢?我总感觉自己写的简历太烂了,所以投了无数份,都石沉大海了。”说实话,我自己好多年没有写过简历了,但我认识的一个同行,他在阿里,给我说了一些他当年写简历的方法论,我感觉太牛逼了,实在是忍不住,就分享了出来,希望能够帮助到你。 01、简历的本质 作为简历的撰写者,你必须要搞清楚一点,简历的本质是什么,它就是为了来销售你的价值主张的。往深...

离职半年了,老东家又发 offer,回不回?

有小伙伴问松哥这个问题,他在上海某公司,在离职了几个月后,前公司的领导联系到他,希望他能够返聘回去,他很纠结要不要回去? 俗话说好马不吃回头草,但是这个小伙伴既然感到纠结了,我觉得至少说明了两个问题:1.曾经的公司还不错;2.现在的日子也不是很如意。否则应该就不会纠结了。 老实说,松哥之前也有过类似的经历,今天就来和小伙伴们聊聊回头草到底吃不吃。 首先一个基本观点,就是离职了也没必要和老东家弄的苦...

男生更看重女生的身材脸蛋,还是思想?

往往,我们看不进去大段大段的逻辑。深刻的哲理,往往短而精悍,一阵见血。问:产品经理挺漂亮的,有点心动,但不知道合不合得来。男生更看重女生的身材脸蛋,还是...

什么时候跳槽,为什么离职,你想好了么?

都是出来打工的,多为自己着想

程序员为什么千万不要瞎努力?

本文作者用对比非常鲜明的两个开发团队的故事,讲解了敏捷开发之道 —— 如果你的团队缺乏统一标准的环境,那么即使勤劳努力,不仅会极其耗时而且成果甚微,使用...

为什么程序员做外包会被瞧不起?

二哥,有个事想询问下您的意见,您觉得应届生值得去外包吗?公司虽然挺大的,中xx,但待遇感觉挺低,马上要报到,挺纠结的。

当HR压你价,说你只值7K,你该怎么回答?

当HR压你价,说你只值7K时,你可以流畅地回答,记住,是流畅,不能犹豫。 礼貌地说:“7K是吗?了解了。嗯~其实我对贵司的面试官印象很好。只不过,现在我的手头上已经有一份11K的offer。来面试,主要也是自己对贵司挺有兴趣的,所以过来看看……”(未完) 这段话主要是陪HR互诈的同时,从公司兴趣,公司职员印象上,都给予对方正面的肯定,既能提升HR的好感度,又能让谈判气氛融洽,为后面的发挥留足空间。...

面试:第十六章:Java中级开发(16k)

HashMap底层实现原理,红黑树,B+树,B树的结构原理 Spring的AOP和IOC是什么?它们常见的使用场景有哪些?Spring事务,事务的属性,传播行为,数据库隔离级别 Spring和SpringMVC,MyBatis以及SpringBoot的注解分别有哪些?SpringMVC的工作原理,SpringBoot框架的优点,MyBatis框架的优点 SpringCould组件有哪些,他们...

面试阿里p7,被按在地上摩擦,鬼知道我经历了什么?

面试阿里p7被问到的问题(当时我只知道第一个):@Conditional是做什么的?@Conditional多个条件是什么逻辑关系?条件判断在什么时候执...

终于懂了TCP和UDP协议区别

终于懂了TCP和UDP协议区别

立即提问
相关内容推荐