There are generally two choices when dealing with reading and processing file data. The first one is to read a file by pieces. It's advantage is low memory consumption.
Code:
bool LoadListbox(char* lpFileName,HWND hWndReceiver){
char *lpData=NULL,*lpLine=NULL;
bool bRtn=true;
DWORD dwRead=0,dwCount=0;
HANDLE hFile=CreateFile(lpFileName,GENERIC_READ,7,0,OPEN_EXISTING,0,0);
if(hFile==INVALID_HANDLE_VALUE){ return false; }
lpData=new char[512];
lpLine=new char[512];
if(!ReadFile(hFile,lpData,512,&dwRead,0)){ bRtn=false; }
while(dwRead&&bRtn){
for(int i=0;i<dwRead;i++){
if(lpData[i]=='\n'){
lpLine[dwCount]='\0';
SendDlgItemMessage(hWndReceiver,IDC_LISTEN,LB_ADDSTRING,0,(LPARAM)lpLine);
dwCount=0;
}
else if(lpData[i]!='\r'&&dwCount<511){
lpLine[dwCount]=lpData[i];
dwCount++;
}
}
if(!ReadFile(hFile,lpData,512,&dwRead,0)){ bRtn=false; }
}
if(dwCount){
lpLine[dwCount]='\0';
SendDlgItemMessage(hWndReceiver,IDC_LISTEN,LB_ADDSTRING,0,(LPARAM)lpLine);
}
delete[] lpLine;
delete[] lpData;
CloseHandle(hFile);
return bRtn;
}
And your way:
Code:
bool LoadListboxBig(char* lpFileName,HWND hWndReceiver){
DWORD dwRead=0,dwCount=0,dwSize=0;
char *lpData=NULL,*lpLine=NULL;
HANDLE hFile=CreateFile(lpFileName,GENERIC_READ,7,0,OPEN_EXISTING,0,0);
if(hFile==INVALID_HANDLE_VALUE){ return false; }
dwSize=GetFileSize(hFile,0);
if(dwSize){
lpData=(char*)HeapAlloc(GetProcessHeap(),0,dwSize);
if(!lpData){
CloseHandle(hFile);
return false;
}
if(!ReadFile(hFile,lpData,dwSize,&dwRead,0)){
CloseHandle(hFile);
HeapFree(GetProcessHeap(),0,lpData);
return false;
}
lpLine=new char[512];
for(int i=0;i<dwRead;i++){
if(lpData[i]=='\n'){
lpLine[dwCount]='\0';
SendDlgItemMessage(hWndReceiver,IDC_LISTEN,LB_ADDSTRING,0,(LPARAM)lpLine);
dwCount=0;
}
else if(lpData[i]!='\r'&&dwCount<511){
lpLine[dwCount]=lpData[i];
dwCount++;
}
}
if(dwCount){
lpLine[dwCount]='\0';
SendDlgItemMessage(hWndReceiver,IDC_LISTEN,LB_ADDSTRING,0,(LPARAM)lpLine);
}
delete[] lpLine;
}
HeapFree(GetProcessHeap(),0,lpData);
CloseHandle(hFile);
return true;
}
I haven't tested them so don't mind any little mistakes - you get the idea.