Dateizeile auslesen



  • hallo
    ich bekomme da nen fehler

    vector ist kein element von std

    was muss ich den da noch ändern ?



  • #include <vector>
    

    siehe MSDN



  • nun bekomme ich folgenden fehler in <vector>

    static void _Xran()
    		{	// report an out_of_range error
    		_THROW(out_of_range, "invalid vector<T> subscript");
    		}
    

    woran kann das liegen?



  • zeig mal den code der das ausloest am besten wo man auch sieht wie du den vector deklariert hast - mein code war nur ausn kopf, also pseudo - haett ich wo dazu schreiben sollen



  • // woerter.cpp: Implementierungsdatei
    //
    
    #include "stdafx.h"
    #include "Vokabeltrainer.h"
    #include "woerter.h"
    #include "neu.h"
    #include <vector>
    
    // woerter-Dialogfeld
    
    IMPLEMENT_DYNAMIC(woerter, CDialog)
    
    woerter::woerter(CWnd* pParent /*=NULL*/)
    	: CDialog(woerter::IDD, pParent)
    	, wort(_T(""))
    	, found(_T(""))
    {
    
    }
    
    woerter::~woerter()
    {
    }
    
    void woerter::DoDataExchange(CDataExchange* pDX)
    {
    	CDialog::DoDataExchange(pDX);
    	DDX_Text(pDX, IDC_EDIT3, wort);
    	DDX_Text(pDX, IDC_EDIT1, found);
    	DDX_Control(pDX, IDC_LIST3, liste);
    }
    
    BEGIN_MESSAGE_MAP(woerter, CDialog)
    	ON_BN_CLICKED(IDC_BUTTON4, &woerter::OnBnClickedButton4)
    	ON_BN_CLICKED(IDC_BUTTON5, &woerter::OnBnClickedButton5)
    END_MESSAGE_MAP()
    
    BOOL woerter::OnInitDialog()
    {
    	CDialog::OnInitDialog(); 
    
    	liste.InsertColumn(0,"suche",LVCFMT_LEFT,50);
     	liste.InsertColumn(1,"deutsch",LVCFMT_LEFT,100);
    	liste.InsertColumn(2,"englisch",LVCFMT_LEFT,100);
    	liste.InsertColumn(3,"französisch",LVCFMT_LEFT,100);
    
    	return true;
    }
    
    void woerter::OnBnClickedButton4()
    {
    	UpdateData(TRUE);
    
    	int not;
    	int line, line_mod;
    	CString sZeile, deu="deu", eng="eng", fra="fra";
    	CStdioFile datei("E:/FH/PROGWZ/Vokabeltrainer/words.txt", CFile::modeRead);
    
    	line=0;
    
    	std::vector<CString> fileContent;
    
    	while( datei.ReadString(sZeile) )
    	{ 
    	    fileContent.push_back(sZeile);
    		line++;
    
    		if( ! sZeile.IsEmpty() )
    		{
    			if(sZeile == wort)
    			{
    				liste.InsertItem(0, wort, 0);
    				line_mod = line%3;
    
    				if(line_mod == 0)
    				{
    					deu = fileContent.at(line-2);
    					eng = fileContent.at(line-1); 
    
    					liste.SetItemText(0, 1, deu);
    					liste.SetItemText(0, 2, eng);
    					liste.SetItemText(0, 3, wort);
    				}
    
    				if(line_mod == 1)
    				{
    					eng = fileContent.at(line+1);
    					fra = fileContent.at(line+2);
    
    					liste.SetItemText(0, 1, wort);
    					liste.SetItemText(0, 2, eng);
    					liste.SetItemText(0, 3, fra);
    				}
    
    				if(line_mod == 2)
    				{
    					deu = fileContent.at(line-1);
    					fra = fileContent.at(line+1);
    
    					liste.SetItemText(0, 1, deu);
    					liste.SetItemText(0, 2, wort);
    					liste.SetItemText(0, 3, fra);
    				}
    
    				not=0;
    				break;
    			}
    			else
    			{
    				not=1;
    			}
    		}
    	}
    
    	if(not==1)
    	{
    		liste.InsertItem(0, wort, 0);
    		liste.SetItemText(0, 1, "nicht gefunden");
    	}
    
    	datei.Close();
    	UpdateData(FALSE);
    }
    
    void woerter::OnBnClickedButton5()
    {
    	neu dlgneu(this); // erzeugt eine neue DialogInstanz
        dlgneu.DoModal();
    }
    

    was genau den fehler macht kann ich dir ned sagen 😞



  • schonmal mit dem debugger durchgesteppt ?

    ich glau das problem ist das line-2 usw
    die schleife faengt ja mit line = 0 an
    wenn die ergebnisse entsprechend sind, wird dann 0 - 2 was bedeutet
    fileContent.at(-2)
    und das ist natuerlich ein ungueltigere bereich, daher die exception

    du solltest es nicht anhaengen und gleich pruefen - sondern erst die gesammte datei auslesen und dann entsprechend bearbeiten
    du brauchst auch die leeren zeilen gar nicht adden

    pseudo (praktischerhalber mal das lesen in eine funktion ausgelagert)

    std::vector<CString> GetFileContent(CString fileName)
    {
        CString sZeile;
        CStdioFile datei(fileName, CFile::modeRead);
    
        std::vector<CString> fileContent;
    
        while( datei.ReadString(sZeile) )
            if(!sZeile.isEmpty())
                fileContent.push_back(sZeile);
    
    }
    
    void woerter::OnBnClickedButton4()
    {
        // gesamte datei holen (ohne leerzeichen)
        std::vector<CString> fileContent = GetFileContent("E:/FH/PROGWZ/Vokabeltrainer/words.txt");
    
        // zeilen durch loopen
        for(int linePos = 0; linePos < fileContent.size(); ++i)
        {
            // to irgendwas mit dem string
            // aktuelle zeile holen mit fileContent.at(linePos);
            // oder durch explizite angabe der nummer fileContent.at(linePos);
            // diese nummer muss aber > 0 und < fileContent.size() sein
        }
    }
    


  • Hallo

    hab allso so gemacht wie von dir beschrieben
    nun kennt er folgendes nimma

    Fehler 1 error C2039: 'isEmpty': Ist kein Element von 'ATL::CStringT<BaseType,StringTraits>' e:\fh\progwz\vokabeltrainer\vokabeltrainer\woerter.cpp 62

    ich verzweifel noch 😞



  • in der alten version stirbt er weil

    Unbehandelte Ausnahme bei 0x7c812aeb in Vokabeltrainer.exe: Microsoft C++-Ausnahme: std::out_of_range an Speicherposition 0x0012e6a4..

    und in der vector datei bei

    static void _Xran()
    		{	// report an out_of_range error
    		_THROW(out_of_range, "invalid vector<T> subscript");
    		}
    

    auch wenn ich das line+1 weg mache und einfach einen wert reinmache



  • Nochwas

    meine fileContent.size(); ist immer 1 obwohl da mehr einträge als einer drin is



  • Hallo,

    Fehler 1 error C2039: 'isEmpty': Ist kein Element von 'ATL::CStringT<BaseType,StringTraits>' e:\fh\progwz\vokabeltrainer\vokabeltrainer\woerter.cpp 62

    Es muss auch IsEmpty heissen... 😉

    MfG,

    Probe-Nutzer


Anmelden zum Antworten