tutorials.de Buch-Aktion 05/2012
ERLEDIGT
NEIN
ANTWORTEN
8
ZUGRIFFE
935
EMPFEHLEN
  • An Twitter übertragen
  • An Facebook übertragen
AUF DIESES THEMA
ANTWORTEN
  1. #1
    Kleiner Wicht Kleiner Wicht ist offline Mitglied Silber
    Registriert seit
    Jan 2005
    Beiträge
    60
    Tach,

    Ick hab ne Datei die is 3.5GB gross nun wollte ich diese öffnen und dabei
    den Dateizeiger mit seekg() auf Position 3.4GB setzen um von der Position an
    dann die Daten aus der Datei in eine andere zu schreiben.

    Der Dateizeiger lässt sich aber nicht setzen und ergibt immer Position 0,
    da der Wert über 2GB geht.

    Code :
    1
    2
    3
    4
    5
    6
    7
    8
    9
    
     
            char datei[] = "d:\\123.bin"; // Test-Datei grösser als 2GB
            fstream file(datei,ios_base::in|ios_base::binary);  // Datei binär öffnen
     
            if(!file.is_open())
                    return;  //Zugriff nicht möglich;
     
            unsigned long int Z = 3400000000;
            file.seekg(Z);

    In der letzten Zeile soll mit seekg der DateiZeiger auf Position 3400000000 gesetzt werden aber die Position ist immer 0.

    Weiss jemand ob das überhaupt geht ? oder wie man das machen kann ?

    bis denne
     

  2. #2
    radazong radazong ist offline Mitglied Silber
    Registriert seit
    Aug 2007
    Beiträge
    84
    Hi.
    Ich bin mir ja nicht sicher ob es dir bei deinem Problem hilft, aber du musst doch noch angeben, von welcher Position aus du den Zeiger weitersetzten möchtest.

    Code cpp:
    1
    
    file.seekg(z, ios::beg);

    Aber ich glaub der Parameter ist nur optional - aber vielleicht hilfts ja.

    Gruß
     

  3. #3
    Kleiner Wicht Kleiner Wicht ist offline Mitglied Silber
    Registriert seit
    Jan 2005
    Beiträge
    60
    Leider geht das och net.
    Habe es eben nochmals getestet ohne Erfolg.

    Wie behandelt man solche Sachen ?

    bis denne
     

  4. #4
    deepthroat deepthroat ist offline Mitglied Diamant
    tutorials.de Premium-User
    Registriert seit
    Jun 2005
    Beiträge
    8.168
    Hi.
    Zitat Zitat von radazong Beitrag anzeigen
    Aber ich glaub der Parameter ist nur optional - aber vielleicht hilfts ja.
    Ja, die Methode ist überladen. Mit einem Parameter wird die Position relativ vom Dateibeginn verändert.

    @Kleiner Wicht: Wie überprüfst du denn wo der Zeiger steht?

    Gruß

    PS: Kann natürlich sein, das deine benutzte C Bibliothek das so nicht unterstützt. Dann könntest du es aber schrittweise machen: erstmal bis 2G und dann noch 1,3GB weiter ab der aktuellen Position.
    Geändert von deepthroat (26.10.07 um 21:27 Uhr)
     
    If at first you don't succeed, try again. Then quit. No use being a damn fool about it.

  5. #5
    Kleiner Wicht Kleiner Wicht ist offline Mitglied Silber
    Registriert seit
    Jan 2005
    Beiträge
    60
    Also die Position des Dateizeigers ermittle ich so:

    Code :
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    
     
            char datei[] = "d:\\123.bin"; // Test-Datei grösser als 2GB
            fstream file(datei,ios_base::in|ios_base::binary);  // Datei binär öffnen
     
            if(!file.is_open())
                    return;  //Zugriff nicht möglich;
     
            unsigned long int Z = 1024;   // 2147483647
            file.seekg(Z);
     
            unsigned long int p = file.tellg();
            ShowMessage(p);                       //Ausgabe der DateizeigerPosition

    Wenn ich nun den DateiZeiger auf 2147483647 + 1 setze und versuche
    ab dieser Stelle auszulesen fängt er bei Position 0 an zu lesen und nicht bei
    Pos 2147483648, jedenfalls stehen dann in meinen buffer die Daten vom Anfang der Datei drin und nicht diese ab Pos 2147483648.

    Aber wenn ich nun den Dateizeiger auf Position 2147483647 setze und
    dann beginne mit lesen dann geht er drüber über die 2147483647 bytes und
    liesst die Datei aus.

    Ich kann aber manuell den DateiZeiger nicht über 2147483647 bytes setzen dann beginnt er bei 0.

    Wie soll ich also nun an eine Position springen die
    erst über 2147483647 bytes beginnt , wenn er dann auf 0 springt ?

    Vielleicht gehts ja doch irgendwie ?

    bis denne
     

  6. #6
    deepthroat deepthroat ist offline Mitglied Diamant
    tutorials.de Premium-User
    Registriert seit
    Jun 2005
    Beiträge
    8.168
    Hi.

    Wie es aussieht ist das eine Limitierung des von dir benutzen Kompilers/STL/C Bibliothek.

    Du kannst dir das Limit so ausgeben lassen:
    Code cpp:
    1
    2
    3
    4
    
    #include <limits>
    #include <streambuf>
     
    cout << std::numeric_limits<std::streamsize>::max() << endl;
    Wenn es nicht irgendwo einen Schalter wie _LARGEFILE_SOURCE oder _FILE_OFFSET_BITS bei deiner verwendeten Bibliothek gibt, wirst du mit den IOStreams nicht weiter kommen.

    Du könntest mal schauen ob es 64 Bit Versionen von ftell und fseek in deiner verwendeten C Bibliothek gibt.

    Gruß
     
    If at first you don't succeed, try again. Then quit. No use being a damn fool about it.

  7. #7
    Kleiner Wicht Kleiner Wicht ist offline Mitglied Silber
    Registriert seit
    Jan 2005
    Beiträge
    60
    Habe das mal getestet und erhalte dann als Ausgabe: 2147483647

    Code :
    1
    
    cout << std::numeric_limits<std::streamsize>::max() << endl;

    Habe nur 32Bit Versionen zu ftell und fseek gefunden wenn ich mich da nich irre.
    Jedenfalls geht der Wertebereich nur bis 2147483647 -> int bzw. long int.

    bis denne
     

  8. #8
    bueyuekt bueyuekt ist offline Grünschnabel
    Registriert seit
    May 2007
    Beiträge
    2
    Ist jetzt zwar etwas her, aber vielleicht hilft es dir.

    du verwendest zum einen unsigned long. Der ist aber auf 2 GB begrenzt. Du musst
    den datentyp ändern. long long oder fpos_t sollte da helfen.

    Zusätzlich kannst du dir ja die ANSI funktion fsetpos anschauen.

    PS: ich arbeite nicht mit Borland...
     

  9. #9
    bueyuekt bueyuekt ist offline Grünschnabel
    Registriert seit
    May 2007
    Beiträge
    2
    Achso...

    fgetpos ist die 64 BIT ANSI funktion....
     

Ähnliche Themen

  1. Antworten: 1
    Letzter Beitrag: 05.03.08, 15:10
  2. Antworten: 2
    Letzter Beitrag: 12.02.08, 18:21
  3. Antworten: 2
    Letzter Beitrag: 09.04.07, 18:07
  4. Antworten: 4
    Letzter Beitrag: 19.09.06, 10:09
  5. Datei Zugriff über Applet durch eine Policy - Datei
    Von Kian_the_klingon im Forum Java
    Antworten: 0
    Letzter Beitrag: 31.07.04, 20:23