fstreams - zu wenig speicher reserviert?



  • hallo,

    ich arbeite an einem programm, das folgendes machen soll:
    mit diesem programm sollen verschiedene txt-dateien geöffnet werden können, aber alle vom gleichen aufbau, nur mal mehr werte, mal weniger..

    1. log.txt mit hilfe von istream einlesen. diese datei besteht aus hex-werten und text.
    2. textteile aus dieser datei "rauslöschen"(datei kürzen) und datei unter neuem namen cut.txt mit hilfe von ofstream speichern.
    3. mit hilfe der fstreams cut.txt einlesen und die zu benötigten werte mit hilfe des dateipositionszeigers entnehmen. bemerkung: die position der benötigten werte richtet sich nach einem in der log.txt vereinbarten aufbau.
    4.die entnommenen werte in int-werte umwandeln und wiederum in einer datei values.txt speichern.

    bemerkungen:
    ich habe keine vectoren verwendet, nur mit strings und chars (getline + get) gearbeitet(auch weil ich von vectoren null ahnung hab, obwohl ich weiß, dass sie viele vorzüge haben)
    ich habe während des programmierens nur eine log.txt als test verwendet. diese log.txt ist 29,5 kb groß.
    das Programm funktioniert einwandfrei, die verlangten werte werden extrahiert und umgewandelt, alle dazu benötigten dateien erstellt.

    jetzt kommt das problem:

    mit einer 1.1mbyte großen log.txt funktioniert es nicht.
    es wird nicht einmal die cut.txt erstellt, daher kommt mein verdacht, das nicht genug speicher für die ein-und ausgabestreams zur verfügung steht.

    diese werden ganz normal aufgerufen (Punkt 1+2):

    ifstream datei;
    ofstream dateineu("cut.txt");
    datei.open("log.txt", ios::in);
    

    und dann weiter:

    string zeile,start="versorgung",ende="0600";//Start und Ende der zu
      bool ign=false;                          //überspringenden Sequenz
      int i;
      if (datei)
      while(!datei.eof())
      {
        getline(datei,zeile);
    
        if(zeile.find(start)!=string::npos) ign=true; //Blockanfang gefunden
        if(zeile.find(ende) !=string::npos) ign=false;//Blockende gefunden
        if (!ign)
    	dateineu=zeile;
      }
      else cout << "Datei konnte nicht geöffnet werden !" << endl;
      datei.close();
      dateineu.close();
    

    mein gefühl sagt mir, ich muss die strings, die ich mit getline einlese, in einen vector stecken, aber ich weiß nicht, wie das funktionieren soll.
    was könnte noch das problem sein ?

    liebe grüße maik 🙂



  • Sag blos, das Programm lässt sich compilieren? Da fällt mir schon auf Anhieb ein Fehler auf - einem Stream kann man keinen String zuweisen (Zeile 12).

    (Ausgaben kannst du mit dateineu<<zeile<<endl; machen)



  • const std::string beg("versorgung");
    const std::string end("0600");
    
    std::ifstream file_in("log.txt");
    std::ofstream file_out("cut.txt");
    if (!file_in) return false;
    
    bool in_part(false);
    std::string cur_line;
    while (std::getline(file_in, cur_line))
    {
        if (in_part == false && cur_line.find(beg) != std::string::npos) in_part = true;
        if (in_part == true && cur_line.find(end) != std::string::npos) in_part = false;
        if (in_part == false) file_out << cur_line << std::endl;
    }
    

    das ist so in etwa das was du da stehen hast einmal korrigiert ... geht aber wesentlich eleganter!



  • ähm ja ich meinte natürlich:

    dateineu << zeile << endl;
    

    hab mich nur verschrieben.
    nur so lässt sich das programm kompilieren 😉
    danke das du mich auf den fehler aufmerksam gemacht hast.

    aber zurück zu meinem problem, ist das einigermaßen verständlich ?
    benötigen große text-dateien speicherallokation für ein - und ausgabestreams ?
    und muss ich vectoren nehmen, um mein ziel auch mit großen txt dateien zu realisieren?

    liebe grüße maik 🙂



  • Naja das wäre schwachsinng, wenn du einen Vector nehmen würdest ... DANN würdest du für den kompletten Dateiinhalt Speicher aufm Heap anfordern müssen ^^



  • (D)Evil schrieb:

    const std::string beg("versorgung");
    const std::string end("0600");
    
    std::ifstream file_in("log.txt");
    std::ofstream file_out("cut.txt");
    if (!file_in) return false;
    
    bool in_part(false);
    std::string cur_line;
    while (std::getline(file_in, cur_line))
    {
        if (in_part == false && cur_line.find(beg) != std::string::npos) in_part = true;
        if (in_part == true && cur_line.find(end) != std::string::npos) in_part = false;
        if (in_part == false) file_out << cur_line << std::endl;
    }
    

    das ist so in etwa das was du da stehen hast einmal korrigiert ... geht aber wesentlich eleganter!

    danke für die schnelle antwort!
    komme damit aber leider der lösung meines problems nicht näher. 😞
    was kann die ursache dafür sein, dass die datei cut.txt mit hilfe einer log.txt (ca. 30kb) erstellt wird und bei einer log.txt(ca.1.1mbyte) nicht ??

    @(D)Evil:
    übrigens wo ist bei dir der befehl zum öffnen von der log.txt ?
    ich seh nur den eingabestrom.

    liebe grüße maik 🙂



  • maik, der c++ anfänger schrieb:

    was kann die ursache dafür sein, dass die datei cut.txt mit hilfe einer log.txt (ca. 30kb) erstellt wird und bei einer log.txt(ca.1.1mbyte) nicht ??

    Gibt das Programm eventuell noch eine Fehlermeldung, bevor es sich verabschiedet? Ansonsten solltest du es mal mit einem Debugger versuchen.

    übrigens wo ist bei dir der befehl zum öffnen von der log.txt ?
    ich seh nur den eingabestrom.

    Die wird genau wie die cut.txt per Konstruktor geöffnet 😉



  • CStoll schrieb:

    Gibt das Programm eventuell noch eine Fehlermeldung, bevor es sich verabschiedet? Ansonsten solltest du es mal mit einem Debugger versuchen.

    'Rechteck.exe': 'C:\Dokumente und Einstellungen\vollandt\Eigene Dateien\Visual Studio Projects\Rechteck\Debug\Rechteck.exe' geladen, Symbole geladen.
    'Rechteck.exe': 'C:\WINNT\system32\NTDLL.DLL' geladen, Erforderliche DBG-Datei wurde nicht gefunden oder konnte nicht geladen werden.
    'Rechteck.exe': 'C:\WINNT\system32\KERNEL32.DLL' geladen, Erforderliche DBG-Datei wurde nicht gefunden oder konnte nicht geladen werden.
    Der Thread 'Win32 Thread' (0x3d4) hat mit Code -1073741510 (0xc000013a) geendet.
    Das Programm "[1628] Rechteck.exe: Systemeigen" wurde mit Code -1073741510 (0xc000013a) beendet.

    komisch, wenn ich haltepunkte setze, dann wird die datei cut.txt auch bei der 1.1mbyte großen log.txt erstellt. wenn ichs normal durchrasseln lasse, kommt keine fehlermeldung weiter, die cut.txt wird aber nicht erstellt 😮

    liebe grüße maik 🙂


Anmelden zum Antworten