Codeoptimierung: TMemoryStream zu ifstream casten? Oder: Wie geht es eleganter?



  • UNIXgenerierte File, enthält nur \n, was Win aber net reicht. Also den TMemoryStream in ne temp.txt und die dann mit ifstream auslesen und alles in ein Memo schreiben, bis ein \n auftaucht und dann ne neue Zeile beginnen; anschließend als dump.txt abspeichern. Ich könnt wetten, gleich schütteln ein paar den Kopf bei so einem Code 😮 Aber darum post ich hier: Ich würd gern das temp und das Memo sparen und direkt den mem abspeichern....

    void __fastcall TmfMain::Verbinden1Click(TObject *Sender)
    {
      string path=ExtractFilePath(Application->ExeName).c_str();
      path+="temp.txt";
      //Kontaktet Server und schaut, ob es eine neuere Version gibt
      TMemoryStream *mem = new TMemoryStream();
      string url=mfSettings->edtMirror1->Text.c_str();
      url+="dump.txt";
      IdHTTP1->Get(url.c_str(), mem);
      mem->SaveToFile(ExtractFilePath(Application->ExeName)+"temp.txt");
      delete mem;
    
      std::string puffer; char c;
      std::ifstream in (path.c_str());
      //solange wiederholen, bis Ende der Datei erreicht ist
      while(in.get(c))
      {
        //checken, ob das Zeichen einen Zeilenumbruch darstellt
        if (c == '\n')
        {
          // ins Memo zwischen speichern
          Memo1->Lines->Add(puffer.c_str());
          // puffer löschen
          puffer.erase();
        }
        else
          puffer += c;
      }
      Memo1->Lines->SaveToFile(ExtractFilePath(Application->ExeName)+"dump.txt");
      einlesen();
      //eigentlich sollte die temp-File gelöscht werden... warum er net mag, is mir
      //ein Rätsel...
      DeleteFile(path.c_str());
    }
    


  • Florianer,

    Vorschläge:

    1. Arbeite gleich mit Deinem MemoryStream, statt die Daten erst in eine Datei zu schreiben.
    2. Schreibe die modifizierten Zeichen direkt in einen Ausgabe-FileStream, statt sie erst in ein Memo zu quälen.
    3. Und als Optimierung wirkt ein char-Array als Zwischenpuffer beim Auslesen oft Wunder.


  • Statt in einen Stream könntest du die Seite direkt in die Text-Property einer TStringList laden und dort mitttels StringReplace die Zeilenumbrüche ersetzen. Und dann halt SaveToFile.


Anmelden zum Antworten