argv in ifstram übergeben



  • Hallo,

    mein Problem ist Folgendes:
    Ich möchte in der "main", "argv" in eine Funktion "number" übergeben.
    Diese Funktion ist in einer externen Datei initialisiert und noch einmal in einer anderen Datei definiert.
    Wieso kann ich in "number" nicht ein "ifstream" Objekt mit "argv" erzeugen?? 😕

    Danke gleich mal für jede Antwort!! 👍

    Hier mein Code:

    main:

    #include <iostream>
    
    int main(int argc, char * argv[])
    {
    	int n = number(argc, argv);
    	std::cout << n;
    	system("Pause");
    	return 0;
    }
    

    Atom.cpp:

    #include <iostream>
    #include <fstream>
    
    using namespace std;
    
    int number(int argc, char * argv[])
    {
    	ifstream inTxt(argv[1]);
    	int n;
    	inTxt >> n;
    	inTxt.close();
    	return n;
    }
    

    Atom.h

    #ifndef Atom_h___
    #define Atom_h___
    
    int number(int, char **);
    
    #endif
    


  • "kann nicht" ist keine ausreichende fehlerbeschreibung.



  • Was geht denn nicht? Compier kompiliert nicht, Linker linkt nicht, Datei nicht gefunden, Programm stürzt ab, Programm gibt die falsche Zahl aus...

    Und möglichst die Fehlermeldung hier rein kopieren.

    Ich rate mal, dass das Programm läuft, aber er findet die Datei nicht, inTxt >> n schlägt fehl und number gibt eine uninitialisierte Zahl zurück. Versuch mal sowas:

    #include <iostream>
    #include <fstream>
    #include <exception>
    
    using namespace std;
    
    int number(char *argv[]){
    	ifstream inTxt(argv[1]);
    	if (!inTxt)
    		throw runtime_error("Failed opening file");
    	int n;
    	if (!inTxt >> n){
    		inTxt.close(); //todo: RAII
    		throw runtime_error("Failed reading file");
    	}
    	inTxt.close(); //todo: RAII
    	return n;
    }
    
    int main(int argc, char *argv[]){
    	try{
    		int n = number(argv);
    		std::cout << n;
    	}
    	catch (exception &e){
    		std::cout << "Error: " << e.what() << '\n';
    	}
    	system("Pause");
    }
    


  • Ein #include <Atom.h> in (vor) main wäre auch nicht schlecht.



  • Also wie du schon gesagt hast

    inTxt >> n schlägt fehl und number gibt eine uninitialisierte Zahl zurück

    und wenn ich das "iftream" Objekt direkt mit "input.txt" als Parameter aufrufe, findet der Debugger es. Das heißt ich erhalte die richtige Zahl, wenn das Programm mit F5(Debbuging starten) starte. Andererseits erhalte ich trotzdem eine uninitialisierte Zahl, wenn ich die *.exe mit Doppelklick oder in der cmd im richtigen Ordner öffne.

    Vieleicht hat es damit was zu tun, dass der Professor, gesagt hat wir sollen in den Projekt Eigenschaften "Vorkompilierte Header nicht verwenden" schalten.

    Mit den Exceptions kenn ich mich leider noch nicht so aus.
    Wenn ich es trotzdem mache kommen diese Fehler:

    Fehler 1 error C2061: Syntaxfehler: Bezeichner 'exception' c:\users\ <Benutzername> \documents\visual studio 2013\projects\test\test\main.cpp 11 1 test
    Fehler 2 error C2310: catch-Handler muss einen Typ angeben c:\users\ <Benutzername> \documents\visual studio 2013\projects\test\test\main.cpp 11 1 test
    Fehler 3 error C2065: 'e': nichtdeklarierter Bezeichner c:\users\ <Benutzername> \documents\visual studio 2013\projects\ <Projektname> \ <Projektname> \main.cpp 12 1 test
    Fehler 4 error C2228: Links von ".what" muss sich eine Klasse/Struktur/Union befinden. c:\users\ <Benutzername> \documents\visual studio 2013\projects\ <Projektname> \ <Projektname> \main.cpp 12 1 test
    Fehler 5 error C2317: Der 'try'-Block ab Zeile '7' besitzt keine catch-Handler c:\users\ <Benutzername> \documents\visual studio 2013\projects\ <Projektname> \ <Projektname> \main.cpp 14 1 test
    Fehler 6 error C2601: 'number': Lokale Funktionsdefinitionen sind unzulässig c:\users\ <Benutzername> \documents\visual studio 2013\projects\ <Projektname> \ <Projektname> \atom.cpp 10 1 test
    7 IntelliSense: Der Bezeichner ""exception"" ist nicht definiert. c:\Users\ <Benutzername> \Documents\Visual Studio 2013\Projects\ <Projektname> \ <Projektname> \Main.cpp 11 9 test



  • @DirkB:
    Das habe ich bei mir eigentlich drinnen stehen. Ich weiß auch nicht wieso ich das nicht mit reinkopiert hab 😮

    ...und DANKE für eure Antworten!!



  • Entweder hast du #include <exception> vergessen oder kein using namespace std; oder das std:: vor std::exception vergessen.
    Weiterhin ist Visual Studio etwas komisch. Wenn du die exe über Visual Studio startest, dann ist der aktuelle Ordner nicht der exe-Ordner, sondern der Projektordner. Gib der exe mal einen absoluten Pfad, C:\temp\test.txt oder so.



  • Ja, hat nur das "std::" gefehlt. 🤡

    Jetzt habe ich das Problem, dass ich es unter F5 nicht mit Parameter debuggen kann.
    In der cmd wirft er die Exception und ich erhalte den cout stream inder Konsole: "Error: Failed opening file"

    mfg



  • Das ist doch gut.
    Der kann die Datei wirklich nicht finden.
    Gib mal einen absoluten Pfad an.



  • nwp3 schrieb:

    Weiterhin ist Visual Studio etwas komisch. Wenn du die exe über Visual Studio startest, dann ist der aktuelle Ordner nicht der exe-Ordner, sondern der Projektordner.

    Das hat den Grund, dass sich Release und Debug das gleiche working_set_directory teilen. Ich finde das praktisch.



  • Da ändert sich leider nichts. 😕

    mfg



  • Du kannst im Projekt unter debug Aufrufparameter angeben und das working directory festlegen.



  • Weiterhin in der cmd:
    Error: Failed opening file

    Über F5 mit übergebenen Parameter:
    0

    mfg



  • So, ich habe jetzt dem Debugger auch de kompletten Pfad gegeben. jetzt kommt bei beiden:
    Error: Failed opening file

    mfg



  • Dann steht die Datei nicht dort oder in argv[1] steht nicht der Pfad (weil er z.B. Leerzeichen enthält).



  • Habe das ganze jetzt nochmal neu gemacht.
    Dabei habe ich das *.txt Dokument wo anders hingetan. (Indem Pfad waren leerstellen 🤡 )

    und n habe ich mit n initialisiert:

    int number(char *argv[]){
    	ifstream inTxt(argv[1]);
    	if (!inTxt)
    		throw runtime_error("Failed opening file");
    	int n=0;              //HIER!!!!!
    	if (!inTxt >> n){
    		inTxt.close(); //todo: RAII
    		throw runtime_error("Failed reading file");
    	}
    	inTxt.close(); //todo: RAII
    	return n;
    }
    

    output:
    0

    Bitte helft mir 😞
    mfg



  • und n habe ich mit n initialisiert

    natürlich mit 0.

    mfg



  • Und was steht in argv[1]?
    RAII macht der stream ganz alleine, ist ist weder was todo noch ist ein close notwendig.



  • manni66 schrieb:

    RAII macht der stream ganz alleine, ist ist weder was todo noch ist ein close notwendig.

    Das war auch glaub ich eher ein Scherz von nwp3.



  • So, ich habe mir argv[1] ausgeben lassen.
    Ich hätte dem Debugger den Pfad ohne abschließendes Semikolon angeben müssen.

    DANKE für eure Hilfe!!
    Es funzt


Anmelden zum Antworten