Programmieren - alles kontrollieren 4.941 Themen, 20.708 Beiträge

Grosse Dateien in VC++

(Anonym) / 4 Antworten / Baumansicht Nickles

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.

bei Antwort benachrichtigen
thomas woelfer (Anonym) „Grosse Dateien in VC++“
Optionen

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


this posting contains no tpyos.
bei Antwort benachrichtigen
(Anonym) thomas woelfer „naja, 5mb ist ja nicht wirklich gross. wuerde das ganze einfach in den speicher...“
Optionen

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;
}

bei Antwort benachrichtigen
thomas woelfer (Anonym) „hi, hier mal mein quelltext zur verdeutlichung meines problems. /me is...“
Optionen

solllte voellig ausreichen wenn du aus dem 'int i' ein 'long i' machst.

WM_HOPETHISHELPS
thomas woelfer

this posting contains no tpyos.
bei Antwort benachrichtigen
(Anonym) thomas woelfer „solllte voellig ausreichen wenn du aus dem int i ein long i...“
Optionen

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

bei Antwort benachrichtigen