Textdateien splitten (10kb Stücke)



  • Hallo,

    ich hab eine Textdatei (Test.txt) mit z.B 700kb

    Ich lese die Datei nun ein und möchte sie in konfigurierbaren Stückchen inkl Timestamp rausschrieben

    aus der Test.txt mit 700kb werden dann

    Test_216544545.txt mit 10kb
    Test_435345345.txt mit 10kb
    Test_568756757.txt mit 10kb
    Test_234234233.txt mit 10kb
    Test_902734967.txt mit 10kb
    .
    .
    .
    .
    usw. das Beispiel hier muesste dann ca. 70 Dateien mit jeweils 10kb ergeben

    Meine Frage ist nun wie ich das effizient mit C++ umsetze?



  • Eingabedatei öffnen, Ausgabedatei1 öffnen, 70kb einlesen und schreiben (get & put), nächste Ausgabedatei öffnen, wieder 70kb lesen...

    Effizient würde man das nun mit einer Schleife machen?!



  • - Datei zeilenweise einlesen
    - Dabei die Anzahl der Buchstaben mizählen
    - Immer wenn 10 KB erreicht sind in eine neue Datei schreiben



  • Hallo,

    leg ein char-Array mit der benötigten Größe (in dem Fall 10 kb) an. Du liest dann blockweise aus der Eingabedatei immer 10 kb raus und packst sie in das char-Array. Das Array schreibst du dann in eine Textdatei und weiter geht's.
    Wenn dir das dann nicht schnell genug ist, komm wieder 😉

    MfG

    GPC



  • GPC schrieb:

    Hallo,

    leg ein char-Array mit der benötigten Größe (in dem Fall 10 kb) an. Du liest dann blockweise aus der Eingabedatei immer 10 kb raus und packst sie in das char-Array. Das Array schreibst du dann in eine Textdatei und weiter geht's.
    Wenn dir das dann nicht schnell genug ist, komm wieder 😉

    MfG

    GPC

    Hehe thx, was gibts denn noch schnelleres. Wenn du schnelleres kennst her damit 🙂



  • GPC schrieb:

    Hallo,

    leg ein char-Array mit der benötigten Größe (in dem Fall 10 kb) an. Du liest dann blockweise aus der Eingabedatei immer 10 kb raus und packst sie in das char-Array. Das Array schreibst du dann in eine Textdatei und weiter geht's.
    Wenn dir das dann nicht schnell genug ist, komm wieder 😉

    MfG

    GPC

    Sorry kannst du oder jemand anderst das mir nochmals erklären? ich weiss nicht wirklich wie vorgehen. hab auch im FAQ nichts gefunden. Klar ich wiess wie man das char array anlegt aber nicht wie man das in 10KB Stücken einliest und in einen string schreibt 😞

    Bitte ein wenig erklären und zeigen. Dafür wäre ich sehr dankbar!



  • char buffer[10 * 1024];
    inputFileStream.read(buffer, sizeof(buffer));
    std::string str(buffer, inputFileStream.gcount());
    


  • Mein Gott klar 🙂

    Das passt auch so hab ein File mit 10kb, nun hätte ich gerne den Rest der 700kb datei auch noch in 10kb stücken :(.

    Will sagen: Wie lese ich wieter aus?



  • Lesen bildet:

    Trundle0x7e schrieb:

    Eingabedatei öffnen, Ausgabedatei1 öffnen, 70kb einlesen und schreiben (get & put), nächste Ausgabedatei öffnen, wieder 70kb lesen...

    Effizient würde man das nun mit einer Schleife machen?!

    Oder, für die faulen ein kleiner Code-Schnipsel:

    ifstream input(...);
    char data[10240];
    while(input)
    {
      //bestimme Ausgabenamen
      ofstream output(...);
      input.read(data,sizeof(data));
      output.write(data,input.gcount());
    }
    


  • Hi,

    hatte gedacht, das Problem hat sich erledigt^^

    #include <iostream>
    #include <fstream>
    #include <string>
    #include <cstring>
    
    int main() {
      const int SIZE = 10*1024; //10kb
    
      std::ifstream ifs("file.txt");
      if (!ifs)
        return 1;
    
      std::ofstream ofs;
      char buffer[SIZE];
      time_t t;
    
      while (ifs.good()) {
        ifs.read(buffer, SIZE);
        time(&t);
        ofs.open( ctime(&t) );
        ifs (ofs) {
          ofs.write(buffer, ifs.gcount());  //hier gcount, damit wir beim Rest (der vermutlich < 10kb ist) nicht noch mal den Müll vom letzten mal mit rausschreiben
          ofs.close();
        }
        else {
          cerr<<"Konnte keine Ausgabedatei erzeugen!\n";
        }
      }
      return 0;
    };
    

    So, ist ungetestet und hingeschludert. Keine Garantie 😉

    EDIT: too slow...

    MfG

    GPC


Anmelden zum Antworten