tutorials.de Buch-Aktion 05/2012
ERLEDIGT
NEIN
ANTWORTEN
6
ZUGRIFFE
1482
EMPFEHLEN
  • An Twitter übertragen
  • An Facebook übertragen
AUF DIESES THEMA
ANTWORTEN
  1. #1
    ed0x ed0x ist offline Mitglied
    Registriert seit
    Sep 2008
    Beiträge
    10
    Hallo...

    Ich möchte gerne eine ->belibig<- große datei einlesen lassen...

    ich mach das volgendermaßen:

    Code :
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    
        CHAR ReadBuffer[100];
        DWORD dwBytesRead;
        HANDLE hFile;
     
        hFile = CreateFile("C:/test.txt", GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);
     
        if (hFile == INVALID_HANDLE_VALUE) 
            MessageBox(hWnd, (LPCSTR)GetLastError(), "Could not open file", MB_OK);
     
        if(ReadFile(hFile, ReadBuffer, 100, &dwBytesRead, NULL) == FALSE) {
            MessageBox(hWnd, (LPCSTR)GetLastError(), "Could not read from file", MB_OK);
            CloseHandle(hFile);
        }
     
        if (dwBytesRead > 0) {
            ReadBuffer[dwBytesRead]='\0'; // NULL character 
        } else {
            MessageBox(hWnd, "error", "error", MB_OK);
        }
        CloseHandle(hFile);

    jetzt hab ich aber nur 100 frei in ReadBuffer...

    Jetzt dachte ich mir, ich kann doch mit GetFileSize, die größe der datei herrausfinden und erst DANN ReadBuffer Dekliniren...

    Praktisch so:

    Code :
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    
        DWORD dwBytesRead;
        DWORD FileSize; //new
        HANDLE hFile;
     
        hFile = CreateFile("C:/test.txt", GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);
     
        if (hFile == INVALID_HANDLE_VALUE) 
            MessageBox(hWnd, (LPCSTR)GetLastError(), "Could not open file", MB_OK);
     
        FileSize = GetFileSize(hFile, NULL); //new
        CHAR ReadBuffer[FileSize]; //new <- Zeile 177
     
        if(ReadFile(hFile, ReadBuffer, FileSize, &dwBytesRead, NULL) == FALSE) {
            MessageBox(hWnd, (LPCSTR)GetLastError(), "Could not read from file", MB_OK);
            CloseHandle(hFile);
        }
     
        if (dwBytesRead > 0) {
            ReadBuffer[dwBytesRead]='\0'; // NULL character 
        } else {
            MessageBox(hWnd, "error", "error", MB_OK);
        }
        CloseHandle(hFile);

    aber da bekomm ich immer volgende Fehlermeldung:

    (177) : error C2057: Konstanter Ausdruck erwartet
    (177) : error C2466: Zuordnung eines Arrays der konstanten Größe 0 nicht möglich.
    (177) : error C2133: 'ReadBuffer': Unbekannte Größe
    Mach ich das i.wie falsch?
     

  2. #2
    engelmarkus engelmarkus ist offline Mitglied Brokat
    Registriert seit
    Sep 2007
    Beiträge
    473
    Du musst beim Array die Größe entweder direkt als Zahl oder eine Konstante angeben. Der Compiler muss wissen, wie groß das Array wird. Das kann er nicht, wenn erst zur Laufzeit die Größe bestimmt wird.
     

  3. #3
    ed0x ed0x ist offline Mitglied
    Registriert seit
    Sep 2008
    Beiträge
    10
    hm...wie soll ich das dann realisiren?

    ich habs auch schon so probiert:

    char *ReadBuffer;

    und dann ReadBuffer = malloc(FileSize*sizeof(char));

    -> dann bekomm ich den fehler hier: error C2440: '=': 'void *' kann nicht in 'char *' konvertiert werden

    wobei das ja das gleiche macht wie CHAR ReadBuffer[FileSize];

    Wie soll ich das dann am besten machen?
    Geändert von ed0x (11.09.08 um 00:50 Uhr)
     

  4. #4
    engelmarkus engelmarkus ist offline Mitglied Brokat
    Registriert seit
    Sep 2007
    Beiträge
    473
    Ja was hast du denn mit den Daten aus der Datei vor?
    Du könntest z. B. ein char-array als Puffer nehmen, dann einfach sagen wir 100 Zeichen einlesen und das in eine Schleife packen. So kriegst du die ganze Datei.
    Wenn du was brauchst, wo du die Daten ablegen kannst, dann kannst ja einen vector oder sowas in der Richtung benutzen. Sag uns mal, was du vorhast .
     

  5. #5
    ed0x ed0x ist offline Mitglied
    Registriert seit
    Sep 2008
    Beiträge
    10
    äh..
    ich will ne art datenbank einlesen die ich dann auswerte...

    nur die können unterschiedlich groß sein...
     

  6. #6
    engelmarkus engelmarkus ist offline Mitglied Brokat
    Registriert seit
    Sep 2007
    Beiträge
    473
    Angenommen, deine Daten liegen in der Datei so vor:

    Code :
    1
    2
    
    huhu wie
    gehts dir

    Das heißt, pro Zeile ein Datensatz, die einzelnen Felder durch Leerzeichen getrennt.

    Dann kannst du die z. B. so einlesen und dann auch entsprechend ausgeben:

    Code :
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    
    #include <iostream>
    #include <fstream>
    #include <vector>
     
    struct datensatz
    {
        char teil1[10];
        char teil2[10];
    };
     
    int _tmain(int argc, _TCHAR* argv[])
    {
        std::vector<datensatz> *Daten = new std::vector<datensatz>();
        std::ifstream sr("c:\\test.txt", std::ifstream::in);
     
        while (sr.good())
        {
            struct datensatz d;
     
            sr >> d.teil1 >> d.teil2;
     
            Daten->push_back(d);
        }
     
        std::cout << Daten->at(1).teil1 << std::endl;
     
        getchar();
        return 0;
    }

    Bitte nicht hauen, wenn ich da einen rechten Quatsch mache, ich hab mich nie sonderlich intensiv mit C++ beschäftigt. Zumindest gehts bei mir.
    Ich hab vergessen, die Datei nach dem Einlesen wieder zu schließen...

    EDIT: Jetzt seh ich grade, dass du ja die WinApi benutzen wolltest? Gibts dafür einen bestimmten Grund?
    Geändert von engelmarkus (11.09.08 um 02:07 Uhr)
     

  7. #7
    ed0x ed0x ist offline Mitglied
    Registriert seit
    Sep 2008
    Beiträge
    10
    also, volgendes:

    ich hab mir schon ein solches programm geschreiben, nur in C++ Konsolenanwendung...

    Jetzt wollt ich halt ne schöne GUI dazu machen...

    Kann ich eigentlich das eingelesene aus der datei auch in einem String speichern?
     

Ähnliche Themen

  1. WinApi Frage zu showWindow
    Von roxX0r im Forum C/C++
    Antworten: 0
    Letzter Beitrag: 27.10.07, 00:03
  2. Download per readfile()
    Von TchiboMann im Forum PHP
    Antworten: 10
    Letzter Beitrag: 07.09.07, 00:19
  3. Frage zum Tutorial (bzw. readfile ())
    Von Rinejunky im Forum PHP
    Antworten: 6
    Letzter Beitrag: 23.10.05, 23:23
  4. Problem readfile();
    Von liquidbeats im Forum PHP
    Antworten: 7
    Letzter Beitrag: 21.08.05, 14:25
  5. ReadFile Funktion
    Von wasa im Forum VisualStudio & MFC
    Antworten: 6
    Letzter Beitrag: 24.07.04, 16:52