Vektor funktion



  • Hey,
    habe hier n Programm, bei dem ich n array brauche, was aber noch keine Bestimmte größe hat, dabei bin ich auf Vektoren gestoßen. Leider funktioniert das noch nicht so ganz. Immer wenn ich mein Programm starte und es bei der ausgabe des Vekores angekommen ist, stürtzt das programm ab.

    fstream Opener;
    string Profiles;
    vector<string> File;
    
    Opener.open(".\\default\\Profiles.txt", ios::in);
    for (int i = 0; i < zuInt(Profiles) && !Opener.eof(); i++)
    {
    	getline(Opener, File[i]);
    }
    Opener.close();
    
    int z = 0;
    
    for (int i = 5; i < 26; i = i + 4)
    {
    	cout << File[z] << endl;
    	z++;
    }
    

    Is nur en Abschnitt, aber vector is included, zuInt is ne funktion die nen String zu nem Int macht, Profiles hat nen Wert auch wenns hier nicht so aussieht und falls ich iwelche variablen vergessen hab, sind sicher drin, es liegt nur iwas am Vektor. Wundert euch nicht über die for schleife, die brauch ich fürs Programm, hab hald nur grob ma rauskopiert.

    Bin noch Anfänger, also bitte Deutsch schreiben

    Danke


  • Mod

    1234567890 schrieb:

    getline(Opener, File[i]);
    

    Hast du dafür gesorgt, dass File auch ein Element mit dem Index i hat?

    1234567890 schrieb:

    bitte Deutsch schreiben

    Ja, bitte.



  • Bei sowas bitte immer vollständige, kompilierbare, minimale Beispiele posten, danke. Dann können wir dir in 5 Sekunden sagen, was los ist.

    LG



  • Möglicherweise suchst du soetwas

    std::string line;
        while(getline(Opener, line)) {
          File.push_back(line);
        }
    


  • Hey hier der Compilierbare Code

    #include <iostream>
    #include <vector>
    #include <fstream>
    #include <sstream>
    
    using namespace std;
    
    int zuInt(string word)
    {
    	stringstream sstr(word);
    	int Zahl;
    	sstr >> Zahl;
    	return Zahl;
    }
    
    int main()
    {
    	fstream Opener;
    	string Profiles;
    	vector<string> File;
    
    	Opener.open(".\\default\\Settings", ios::in);
    	for (int i = 0; i < 1 && !Opener.eof(); i++)
    	{
    		getline(Opener, Profiles);
    	}
    	Opener.close();
    
    	Opener.open(".\\default\\Profiles.txt", ios::in);
    	for (int i = 0; i < zuInt(Profiles) && !Opener.eof(); i++)
    	{
    		getline(Opener, File[i]);
    	}
    	Opener.close();
    
    	for (int z = 0; z < 5; z++)
    	{
    		cout << File[z] << endl;
    	}
    }
    

    PS das

    while(getline(Opener, line)) { 
        File.push_back(line); 
    }
    

    funkt nich, und hab das so eigentlich schonmal verwende und dort funktioniert es, allerdings ist das in ziemlich viel code verwickelt, also wenn dann könnt ich da nur nen ausschnitt schicken.

    Und ja ich weiß die eine for schleife ist überflüssig und die variablennamen sind nicht so gut, aber des mal bitte übersehen, danke.

    Danke im Voraus



  • Ein kleiner Hinweis: http://en.cppreference.com/w/cpp/string/basic_string/stol

    Anstat double-backslash kannst du auch "/" in Pfaden verwenden.

    Außerdem, am besten immer prüfen, ob die Datei geöffnet werden konnte, bevor man versucht sie zu benutzen. Dito für jegliche Lese-Operationen.

    camper hat ja schon das Hauptproblem in dem Programm gezeigt.

    Diese ganzen "magic constants" sollte man auch vermeiden. Das sind, irgendwelche Zahlen wie 1 und 5 die im Programm verwendet werden. Ist bei 5 Zeilen nicht so wichtig, aber bei nicht-trivialen Programmen wird das schnell sehr unübersichtlich.

    Wenn man darauf besteht, dasselbe Vorgehen beizubehalten:

    ifstream settings_file("default/Settings");
        if (!settings_file) { /* error */ }
    
        size_t num_profiles {};
        if (!(settings_file >> num_profiles)) { /* error */ }
    
        ifstream profiles_file("default/Profiles.txt");
        if (!profiles_file) { /* error */ }
    
        vector<string> file(num_profiles);
    // wenn in der settings Datei eine 3 stand, siehts jetzt so aus:
    // ["", "", ""]
        for (auto& line : file) {  // range-based for-loop
       // bzw. for (size_t i = 0; i != file.size(); ++i) getline(pfile, file[i])
            if (!getline(profiles_file, line)) { /* error */ }
        }
    
        // Ausgabe
    

    P.S.: Sagt mal ganz schnell laut hintereinander "profiles file" 🤡



  • "funkt nich" - hochpräzise Beschreibung!



  • #include <antenne>
    


  • Okay, denke hab so halbwegs verstanden was ihr so geschrieben habt, aber denke habs doch nicht verstanden, weils trzdem ned funkt.

    Ich leg nen Vektor an vom Typ string, welcher "Profiles" ich nenns mal Plätze hat.
    Syntax : vector<string> File(Profiles);

    Also ich Öffne die Datei, Lese eine Zeile ein und Speicher sie in dem Vektorsektor (sry weiß ned wie man das nennt) File[i]. Stimmt das so oder nicht?
    Syntax : getline(Streamname, File[i]);

    Dann gebe ich File[i] aus.
    cout << File[i];

    Sry falls ich euch nicht verstanden hab.

    Und ich kann hald leider keine Fehlermeldung liefern, weil es Kompiliert etc und dann einfach Abstürtzt ohne igendne Meldung.

    Danke trzdem.



  • Für die Szenarien, wo dein Programm einfach segeln geht, gibt es Debugger. Stichwort Breakpoints

    Oder:

    std::cout << "before" << std::endl;
    // ich will wissen ob diese Zeile knallt
    auto myvar = myvec[5000];
    std::cout << "after" << std::endl;
    

    Wenn die Konsole jetzt so aussieht

    before
    

    Und dein Programm abstürzt, dann knallts wohl zwischendrin.

    Ich würde auf jeden Fall das, was du momentan mit 2 Dateien machst in eine packen, indem du dein eigenes Format defininierst.
    Das kann dann z.B. spezifizieren, dass in der ersten Zeile eine Ganzzahl stehen muss, und dass dieselbe Anzahl Profile folgen müssen, eines pro Zeile.

    3
    Eintrag1
    Eintrag2
    Eintrag3
    

    Nur als Beispiel. Ich hab ja keine Ahnung, was du eigentlich erreichen willst.

    Es ist sehr komisch zuerst die Elemente im vector<string> zu "generieren" und dann via [] da hineinzulesen. Dazu gibts vector::push_back bzw vector::emplace_back.
    Das ist ja der Sinn von vector, dass du praktisch beliebig viele Zeilen lesen kannst.

    LG



  • 1234567890 schrieb:

    es Kompiliert etc und dann einfach Abstürtzt ohne igendne Meldung.

    Und du hältst diese Aussage für äquivalent mit "funkt nicht"?



  • Also wenn ich den Code ausführe siehts so aus: http://i.imgur.com/jz0Wvui.png



  • Ich Programmiere mit Visual Studios und hab da noch ned so ganz durch gecheckt, weswegen ich einfach mit cout und system("PAUSE") meinen eigenen Debugger gemacht habe, und an der stelle, an der es File[i] verwenden soll, sprich ausgeben, Stürtzt es ab, ähnlich wie wenn ich ein Array zu klein definiere. Aber konnte damit noch nichts anfangen, da ich vektoren noch gar nicht richtig kenne.

    Ja, tut mir leid für die "präzise" beschreibung.

    Genau so wie auf dem Screen siehts bei mir auch aus.



  • Du hast 0 Elemente in deinem Vektor, musst also deinem Vektor Elemente hinzufügen. Das machst du mit den Methoden push_back/emplace_back. Kuck dir doch mal die zahlreichen Beispiele im Internet an, wie das mit einem Vektor gemacht wird.



  • Lesen hatten wir schon

    manni66 schrieb:

    std::string line;
        while(getline(Opener, line)) {
          File.push_back(line);
        }
    

    Ausgabe

    for( const auto& line : File) std::cout << line << "\n";
    

    Wenn es dann noch abstürzt, liegt es an deinen dicken Fingern.



  • Stürtzt nicht mehr ab, enthält aber keinen Inhalt.

    Ich werd nicht schlau draus, vielleicht mach ich erstmal ne vordefinierte Profilanzahl.

    Trzdem Danke für eure Hilfe.



  • Dann wurde die Datei nicht gefunden bzw. kann nicht gelesen werden. Du prüfst ja nicht, ob du sie öffnen konntest.



  • O M G bin ich dumm... hab den Filenamen zum öffnen Falsch geschreiben.

    Tja dagegen helfen selbst die besten Programmierer nichts,

    trzdem Danke nomma an euch.



  • 1234567890 schrieb:

    Tja dagegen helfen selbst die besten Programmierer nichts,

    Ich copy-paste mal

    Außerdem, am besten immer prüfen, ob die Datei geöffnet werden konnte, bevor man versucht sie zu benutzen. Dito für jegliche Lese-Operationen.

    ifstream profiles_file("default/Profiles.txt");
    if (!profiles_file) { /* error */ }
    

    Das könnte man z.B: so umsetzen:

    if (!profiles_file) {
        std::cerr << "Unable to open Profiles.txt\n";
        return 1;
    }
    

Anmelden zum Antworten