ifstream in vetor schreiben

robeldiebone

Grünschnabel
ifstream in vector schreiben

Ich möchte kurz mein Problem schildern:

Ich habe eine 80MB große *.log Datei, welche immense Wetterdaten beinhaltet. Ich programmiere mit dem Boarland C++ Builder (ist hier Standard in der Firma). Damit ich die einzelnen Zeilen der Datei einlese verwende ich einfache ifstream und getline Komponenten:

Code:
// Standard CString definiert
typedef struct {
char String[255];
} sString;

ifstream infile;
sString FileNameIn;
infile.open(FileNameIn);

// Mein Vector
sString Buffer;
vector<sString> FileContent;
while(!infile.eof())
{
infile.getline(Buffer.String,sizeof(Buffer.String));
FileContent.push_back(Buffer);
}
infile.close();

Das Problem an der Sache ist, die Datei ist wie schon gesagt 80MB und beinhaltet enorm viele Zeilen.
Und auf die Frage wieso ich keine TStrings nehme - es soll auch auf anderen PCs laufen, und compiliert werden. Das ganze Programm funktioniert mit AnsiStrings und TStrings ohne Probleme und die 80MB File wird in 2 Sekunden gebuffert und denn in einer weiteren ausgelesen und woanders in einem anderen Format gespeichert.
Aber ich will dies nun mit vectoren realisieren, stosse aber dort an Speichergrenzen, wenn ich meine Fehlermeldungen richtig interpretiere.
Habt ihr Lösungen?
 
Zuletzt bearbeitet:
Re: ifstream in vector schreiben

Hi.

Welche Fehlermeldungen bekommst du denn?

Warum willst du es mit Vektoren implementieren?

Bei relativ vielen Elementen wäre es besser schonmal vorab etwas Speicher im Vektor zu reservieren um ständiges Hin- und Herkopieren zu vermeiden.

Ich hab mal folgenden Code getestet (OS: Linux 2.6.12, GCC 4.0.1):
Code:
#include <iostream>
#include <vector>
#include <fstream>
#include <string>

using namespace std;

int main()
{
  vector<string> vs;

  ifstream in ("test.log");

  vs.reserve (1L << 20);

  while (in) {
    string buf;
    getline (in, buf);
    
    if (in) 
      vs.push_back (buf);
  }

  cout << vs.size() << endl;
}
Wobei die Datei "test.log" 80 MiB groß ist und 1555306 Zeilen hat.

Übrigens ist eine Schleife a la
Code:
while (!infile.eof()) { ... }
nicht korrekt. Es kann dann sein, daß ein Zeichen hinter das Dateiende gelesen wird. Woher willst du denn wissen, ob die Funktion getline innerhalb der Schleife überhaupt etwas (sinnvolles) gelesen hat?

Also, immer erst lesen, dann prüfen ob das Lesen erfolgreich war (also den Zustand des Streams abfragen) und wenn ja, den eingelesenen Wert verwenden.

Siehe C++ FAQ 15.4
 
Re: ifstream in vector schreiben

Danke, ich probiere das gleich aus. Meine Datei die ich hab ist 80 MB und hat ca 800000 Zeilen, die aber alle vollgeschrieben sind.
ich hatte meinem vector schon Speicher zugewiesen, aber es ging trotzdem nicht. Aber danke für den Tipp, ich teste es sofort!
 
Zurück