interpretieren einer txt



  • ich weiß nicht warum aber irgentwie will es bei mir nichtklappen mehrere zeichen auf einmal einzulesen.

    so sieht mein quellie zum einlesen aus:

    HANDLE hdatei; 
        int size = 0; 
        DWORD bytes = 0;
    	char zeichen;
    	int tag = 0;
    	int i = 0;
    
        hdatei = CreateFile(TEXT("\\programme\\datei.txt"),GENERIC_READ,FILE_SHARE_READ,NULL,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,NULL);     
    
        size = LOWORD(GetFileSize(hdatei,NULL));
    
    	TCHAR* buffer = new TCHAR[size];
    
    	memset(buffer,'\0',sizeof(TCHAR));
    
    	while(ReadFile(hdatei,&zeichen,1,&bytes,NULL))
    	{
    		if (bytes != 1)
    			break;
    
    			buffer[i++] = zeichen;
    	}
    
    	MessageBox(NULL,buffer,L"",MB_OK);
    
    	delete [] buffer;
        CloseHandle(hdatei);
    

    ich will die eingelesenen zeichen dann über eine messagebox ausgeben, dass heißt ich brauch sie mind. im LPTSTR .

    wenn jemand nen quellcode dazu hat kann er ihn mir ja vieleicht geben ich würde mich freuen.



  • Zitat MSDN:

    BOOL ReadFile(
      HANDLE hFile,
      LPVOID lpBuffer,
      DWORD nNumberOfBytesToRead,
      LPDWORD lpNumberOfBytesRead,
      LPOVERLAPPED lpOverlapped
    );
    

    Deine Funktion:

    ReadFile(hdatei,&zeichen,1,&bytes,NULL)
    

    Wenn Du nNumberOfBytesToRead auf 1 setzt, ist es logisch, das er nur 1 Byte einliest, oder?



  • bin ja net doof.
    ich hatte schon ein dword mit der größe angegeben und alles so gemacht wie es die msdn verlangt und es ging trotzdem net.



  • Wie wäre es mit fgets die Datei Zeilenweise zu lesen, und dann Zeile für Zeile zu parsen

    FILE *InFile;   
    char line[128+1];// das +1 ist eine Marotte von mir um den üblichen Fehler zu     
                     // vermeiden das für die schließende Null kein Platz mehr da ist.       
    
    if (0==(InFile=fopen("filename","r")) {// Fehlerhandling}   
    while (NULL!=fgets(line,128,InFile))   // lese Datei bis zum Ende 
     {   
      if (0==_strnicmp("ENTITIES",line,8))    // Prüfe ohne case insensitiv die ersten 8 Zeichen ob sie "ENTITIES" heißen 
       {
        // tu was du jetzt tun willst
       }
     };   
    fclose(InFile);
    

    Anstoß 4: Wie wäre es mit lexx und yacc oder ihren freeware pandants



  • ich will das ganze aber im LPTSTR haben und net im char!
    char kann ich net mit der messagebox ausgeben.

    das ist dasselbe prob wie bei fileread.

    wenn ich mir "line" ausgeben lasse dann kommen nur lauter kästechen.
    für jeden buchstaben eins.



  • Natürlich kann man das in einer Messagebox ausgeben.

    FILE *InFile;    
    char line[128+1];// das +1 ist eine Marotte von mir um den üblichen Fehler zu      
                     // vermeiden das für die schließende Null kein Platz mehr da ist.        
    
    if (0==(InFile=fopen("filename","r")) {// Fehlerhandling}    
    while (NULL!=fgets(line,128,InFile))   // lese Datei bis zum Ende  
     {   
        MessageBox( NULL, (LPCTSTR)line, "INFO", MB_OK | MB_ICONINFORMATION );
    
      if (0==_strnicmp("ENTITIES",line,8))    // Prüfe ohne case insensitiv die ersten 8 Zeichen ob sie "ENTITIES" heißen  
       { 
        // tu was du jetzt tun willst 
       } 
     };    
    fclose(InFile);
    


  • ReadFile(hdatei,buffer,size,&bytes,NULL);
    


  • ich habe etwas rumprobiert und mir ist nun aufgefallen,
    dass ich keinen ansi aber unicode mit meinem quellcode einlesen kann.
    was muß ich machen um ansi lesen zu können?

    HANDLE hdatei; 
        DWORD size = 0; 
        DWORD bytes = 0;
    
        hdatei = CreateFile(TEXT("\\programme\\wanderkarte\\events.txt"),GENERIC_READ,FILE_SHARE_READ,NULL,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,NULL);     
    
    	size = GetFileSize(hdatei,NULL);
    
    	TCHAR* buffer = new TCHAR[size]; 
    
        memset(buffer,'\0',sizeof(TCHAR)); 
    
    	ReadFile(hdatei,buffer,size,&bytes,NULL);
    
    	CloseHandle(hdatei);
    
        MessageBox(NULL,buffer,L"",MB_OK); 
    
    	buffer[0] = '\0';
    
    	delete[] buffer;
    


  • Wenn du dein Programm mit UNICODE kompilierst ist dein buffer auch entsprechend Unicode (wegen TCHAR)
    Die Unicode and Character Set Functions sind in dem Zusammenhang sicher auch ganz interessant 🙂



  • Um diesem Problem aus dem Weg zu gehen habe ich die 😃 hausbackene Lösung 😃 mit dem fopen und fgets vorgeschlagen



  • Er kann bei Readfile auch einen CHAR buffer angeben, aber damit (und auch mit deiner Lösung) kannst du doch noch nicht direkt Unicode Files lesen 🙄



  • Er beschwert sich ja gerade das er Unicode aber niocht ansi lesen kann, deswegen der Vorschlag



  • suchender schrieb:

    ich habe etwas rumprobiert und mir ist nun aufgefallen,
    dass ich keinen ansi aber unicode mit meinem quellcode einlesen kann.
    was muß ich machen um ansi lesen zu können?

    So ein Quatsch! ReadFile() kümmert sich nicht um ANSI oder UNICODE. Das hat doch nichts mit Strings zu tun. Was du da einliest sind Bytes. Deinen Buffer kannst du als Unicode (also WideChar) oder als ANSI (also Char) auffassen. Wenn du ihn als ANSI interpretieren willst, dann nimm sicherhaltshalber eben keine TCHAR's sondern char's.

    HANDLE hFile;
    DWORD   size = 0;
    DWORD   bytes = 0;
    HGLOBAL hGlobal;
    char*   buf;
    
    hFile = CreateFile(TEXT("\\programme\\wanderkarte\\events.txt"),
                       GENERIC_READ,
                       FILE_SHARE_READ,
                       NULL,
                       OPEN_EXISTING,
                       FILE_ATTRIBUTE_NORMAL,
                       NULL);
    
    size = GetFileSize(hFile, NULL);
    hGlobal = GlobalAlloc(GMEM_FIXED, size);
    buf = (char*)GlobalLock(hGlobal);
    
    ZeroMemory((LPVOID)buf, size);
    ReadFile(hFile, buf, size, &bytes, NULL); 
    CloseHandle(hFile);
    
    MessageBox(NULL, TEXT(buf), TEXT(""), MB_OK);
    GlobalUnlock(hGlobal);
    GlobalFree(hGlobal);
    

Anmelden zum Antworten