2017-10-27 1 views
1

Gibt es einen Weg in C++ mit Standardbibliotheken Binärdaten in einer großen Datei zu überschreiben und den Rest der vorhandenen Daten in der Datei zu erhalten, ohne zuerst die gesamte Datei zu laden?C++ Löschen oder Überschreiben vorhandener Informationen in einer Datei

Beispiel: Wenn ich eine Datei "MyFile" mit dem Text "ABC" habe und "A" durch "Q" ersetzen möchte, gibt es eine Möglichkeit, dies zu tun, ohne "BC" in den Speicher zu laden?

Was ich habe, so weit:

#include <fstream> 

int main(int argc, char** argv) 
{ 
    std::fstream f; 
    f.open("MyFile",std::ios::in); 
    while (f.good()) 
    { 
     char Current = f.get(); 
     if (Current == 'A') 
      break; 
    } 
    int Location = f.gcount()-1; 
    f.close(); 

    if (Location < 0) 
    { 
     printf("Nothing to do.\n"); 
     return EXIT_SUCCESS; 
    } 
    else 
    { 
     f.open("MyFile",std::ios::in | std::ios::out); 
     f.seekp(Location); 
     f.write("Q",1); 
     //f.put('Q'); 
     //f << "Q"; 
     f.close(); 
     return EXIT_SUCCESS; 
    } 
} 

, die jetzt zu funktionieren scheint - dank all.

+0

Warum würden Sie sogar das tun? Das sieht so aus, als ob Sie versuchen würden, eine Datei als Ihre Datenbank lol –

+0

zu verwenden, obwohl auf Benutzerebene ein 1 Byte gelesen werden kann, auf der OS/Hardware-Ebene ist ein einzelner Ladevorgang von einer Datei viel größer. Dies geschieht zur Optimierung, da der Zugriff auf die Festplatte sehr langsam ist. – bolov

+0

Ich versuche eine Datei als Datenbank zu verwenden (^. ^) - diese wird auf einem Rechner mit extrem begrenzten Ressourcen installiert, so dass nur Standard-C++ - Bibliotheken verfügbar sind. – Arlington

Antwort

1

Öffnen Sie Ihre Datei als std::ios::in | std::ios::out, dann, wenn Sie Ihre Position von 'A' haben, verschieben Sie Ihre "Eingabe Caret" zurück an diese Position mit f.seekg(Location); und schreiben Sie in die Datei.

Bitte beachten Sie, dass Sie nur ersetzen/überschreiben können. Sie können nicht an die Mitte einer Datei anhängen.

sollte diese Arbeit:

#include <fstream> 
#include <iostream> 

int main() 
{ 
    std::fstream f("d:\\file.txt", std::ios::in | std::ios::out); 

    char c; 

    while (f >> c) 
    { 
     if (c == 'A') 
     { 
      f.seekp(-1, std::ios_base::cur); 
      f.put('Q'); 
      return EXIT_SUCCESS; 
     } 
    } 

    std::cout << "Nothing to do." << std::endl; 

    return EXIT_SUCCESS; 
} 
+0

Welche Funktion verwende ich zum Schreiben? Wenn ich das tue, hinterlässt es mir eine Datei, die nur den Buchstaben "Q" enthält. Scheint nicht zu funktionieren mit f.put (, f.write (; oder f << – Arlington

+0

@Arlington Es sollte ... aber ohne Ihren eigentlichen Code, gibt es wenig, was ich Ihnen sagen kann. Vielleicht fügen Sie den neuen Code an die Frage? – nvoigt

+0

Neuen Code an das Ende eingefügt – Arlington

Verwandte Themen