Hallo,
ich wüsste gern wie ich grössere Dateien (~5MB) in c++ am besten nach strings durchsuche. Mein problem bei der sache ist nämlich, dass ich einen integer zum zählen benutze und der zu "klein" ist.
Programmieren - alles kontrollieren 4.941 Themen, 20.708 Beiträge
naja, 5mb ist ja nicht wirklich gross. wuerde das ganze einfach in den speicher laden und dann suchen. (das geht allerdings nicht mit den string funktionen, das ansi/iso strings eine laengenbegrenzung habe: mit memcmp sollte das aber gehen).
void* p = malloc( cbFile); // cbFile := grosse der datei in byte
fread( p, sizeof(char), cbFile, fpFile); // := fpFile - filepointer
// jetzt mit memchr nach dem ersten zeichen suchen, dann mit
// strcmp nachsehen ob es der gewuenschte string ist
WM_HOPETHISHELPS
thomas woelfer
hi,
hier mal mein quelltext zur verdeutlichung meines problems.
/me is eigentlich assembler-coder, deswegen tu ich mich ein bisschen schwer mit cpp
SambaIt(HWND hWnd)
{
int check, size, i, x;
char pcname[100] = "",
datum[11] = "",
benutzer[50] = "",
inputdatei[100] = "",
outputdatei[100] = "",
inputbuf[2000000] = "";
HANDLE hInput;
DWORD read;
GetDlgItemText(hWnd,IDC_PC,pcname,100);
check = lstrlen(pcname);
if(check == 0) {
MessageBox(hWnd,"Bitte einen PC-Namen angeben!","Fehler!",MB_OK);
return TRUE;}
GetDlgItemText(hWnd,IDC_DATEI,outputdatei,100);
check = lstrlen(outputdatei);
if(check == 0) {
MessageBox(hWnd,"Bitte einen Dateinamen eingeben!","Fehler!",MB_OK);
return TRUE;}
if(tagcheck2) {
GetDlgItemText(hWnd,IDC_TAG,datum,11); }
if(benutzercheck2) {
GetDlgItemText(hWnd,IDC_BENUTZER,benutzer,50); }
lstrcat(inputdatei, pcname);
lstrcat(inputdatei,".samba.log");
hInput = CreateFile(inputdatei, GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_EXISTING, NULL, NULL);
if(hInput == INVALID_HANDLE_VALUE) {
MessageBox(hWnd,"Fehler beim Öffnen der Datei!\nNicht vorhanden?","Fehler!",MB_ICONWARNING);
return TRUE;}
size = GetFileSize(hInput, NULL);
if(size MessageBox(hWnd,"Die log-Datei ist kleiner als der PC-Name?","Hmmmmmmmmm",MB_ICONQUESTION);
return TRUE; }
ReadFile(hInput, inputbuf, size, &read, NULL);
for(i=0;i if(inputbuf[i] == pcname[0]){
check = lstrlen(pcname);
for(x = 1; x if(!(inputbuf[i+x] == pcname[x])){
break;
}
}
if(check == x){
if(!benutzercheck2 && !tagcheck2) {
}
}
}
}
CloseHandle(hInput);
return TRUE;
}
solllte voellig ausreichen wenn du aus dem 'int i' ein 'long i' machst.
WM_HOPETHISHELPS
thomas woelfer
hi,
danke soweit aber sobald ich den buffer gross genug mache um die datie zu laden gibts ein freudiges "Diese anwendung wird aufgrund...", wenn ich ok klicke, also die Prozedur aufgerufen wird