Dateizeile auslesen
-
pack die ganze datei in nem vector
dann kannst du mit dem index diesem containers auf die jeweilige zeile zugreifenstd::vector<CString> fileContent; while(datei.ReadString(sZeile)) fileContent.push_back(sZeile); . . . CString line5 = fileContent.at(4); CString line3 = fileContent.at(2); . . .
-
hallo
ich bekomme da nen fehlervector 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 exceptiondu 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 addenpseudo (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 nimmaFehler 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