Kontrollieren der Dateiendung?



  • Hallo Leute,
    unzwar habe ich eine Frage. Ich habe mir soweit etwas zusammengebastelt das ich mir Dateien ausgeben lassen kann per Pfad.
    Nun möchte ich wenn man den Pfad angegeben hat und dann da steht z.b. C:\\test.txt
    das der mir angibt das der diese nicht nimmt weil er nur Dateien lesen und ausgeben soll die mit .dta enden.

    Hier mein Code:

    #include <iostream>
        #include <fstream>
    
        using namespace std;
    
        int main(int argc, char *argv[])
        {
            char     filename[128];
            ifstream file;
            char     zeile[80000];
    		int i;
    
            cout << "Pfadangabe machen ohne Dateiendung bitte: " << flush;
            cin.getline(filename, 127);
    
            file.open(filename, ios::in);
    
            if (file.good())
            {
    
                file.seekg(0L, ios::beg);
    			/*file.getline(zeile, 1024);
                cout << zeile << endl;*/ 
                while (file >> i)
                {
    
                    file.getline(zeile, 80000);
                    cout << zeile << endl;
                }
            }
            else
            {
    
                cout << "Datei nicht gefunden." << endl;
            }
    
    		system("pause");
            return 0;
    }
    

    Danke schonmal für die Hilfe

    Gruß SmileStyle


  • Mod

    char-Arrays vergessen, string benutzen, mit string-Methoden die Endung suchen.

    Ich halte das aber für ein ziemliches Anti-Feature, wenn ein Programm Wert legt auf Dateiendungen.



  • Zumal C:\\test.txt ja durchaus eine korrekte Pfadangabe ist.

    (Bei nicht ganz so alten Betriebssystemen, die den \ als Trennzeichen akzeptieren)



  • Wenn ich char durch string ersetze dann erkennt er nicht mehr mein getline
    und ziegt mir da als fehlermeldungen an.

    Das ist ne Anforderung von der Schule finde es selber sinnfrei 😃

    SmileStyle



  • #include <iostream>	// std::cout, std::cin, std::cerr
    #include <string>	// std::string
    #include <fstream>	// std::ifstream
    
    using namespace std;	// Discard to write std::
    
    // Program entry
    int main(){
    	// Ask for filename
        cout << "Pfadangabe machen ohne Dateiendung bitte: ";
        string filename;
        getline(cin, filename);
    	// Check filename extension
    	if(filename.length() > 4 && filename.compare(filename.length()-4, 4, ".dta") == 0){
    		// Read file
    		ifstream ifile(filename.c_str());
    		if(ifile){
    			// Iterate through number + rest of line
    			int line_i; string line;
    			while(ifile >> line_i && getline(ifile, line))
    				// Output line
    				cout <<line << '\n';
    		}else
    			cerr << "Datei nicht gefunden." << endl;
    	}else
    		cerr << "Dateiendung ungueltig." << endl;
    	// Wait for input to end the program
        system("pause");
    }
    

    SmileStyle93 schrieb:

    Wenn ich char durch string ersetze dann erkennt er nicht mehr mein getline

    Es gibt verschiedene getline [1][2].



  • Ah ok, danke für die schnelle Hilfe.

    SmileStyle


  • Mod

    Youka schrieb:

    string filename;
        cin >> filename;
    

    Ich weiß, niemand rechnet mit den fieseren Zeichen, die in Dateinamen enthalten sein können (theoretisch sind sogar newlines möglich), aber Leerzeichen würde ich schon unterstützen. Gerade unter Windows sind die in Ordnernamen sehr üblich ("My XYZ", "Program Files", ...). Die bessere Lösung nennst du doch selber schon:

    Es gibt verschiedene getline [1][2].



  • Youka schrieb:

    using namespace std;	// Discard to write std::[/cpp]
    

    YMMD

    string filename;
        cin >> filename;
    

    Da war getline besser. Dateinamen können auch Leerzeichen enthalten.

    // Check filename extension
    	if(filename.length() > 4 && filename.rfind(".dta") == filename.length()-4){
    

    Unnötig umständlich und langsam, aber ok.

    if(ifile.good()){
    

    .good() ist so gut wie nie eine gute Idee. Funktioniert hier zwar, aber nimm entweder is_open oder if(ifile).

    cerr << "Datei nicht gefunden." << endl;
    	}else
    		cerr << "Dateiendung ungueltig." << endl;
    

    Sieht ja aus wie C.
    Fehlerbehandlung bitte sofort machen.

    if (filename.size()<4 || filename.compare(filename.size()-4, 4, ".dta")) {
      cerr << "Dateiendung ungueltig." << endl;
      return -2;
    }
    if (!ifile.is_open()) {
      cerr << "Datei nicht gefunden." << endl;
      return -1;
    }
    


  • SeppJ schrieb:

    Ich weiß, niemand rechnet mit den fieseren Zeichen, die in Dateinamen enthalten sein können (theoretisch sind sogar newlines möglich), aber Leerzeichen würde ich schon unterstützen. Gerade unter Windows sind die in Ordnernamen sehr üblich ("My XYZ", "Program Files", ...). Die bessere Lösung nennst du doch selber schon:...

    Arg, stimmt, ich nenn es mal einen Flüchtigkeitsfehler :p

    notapro schrieb:

    // Check filename extension
    	if(filename.length() > 4 && filename.rfind(".dta") == filename.length()-4){
    

    Unnötig umständlich und langsam, aber ok.

    Mir fiele nur das Ersetzen von rfind durch compare ein.


  • Mod

    Youka schrieb:

    notapro schrieb:

    // Check filename extension
    	if(filename.length() > 4 && filename.rfind(".dta") == filename.length()-4){
    

    Unnötig umständlich und langsam, aber ok.

    Mir fiele nur das Ersetzen von rfind durch compare ein.

    Klingt doch gut. Wenn wir gucken wollen, ob die letzten vier Zeichen einen bestimmten Wert haben, dann gucken wir uns doch lieber nur die letzten vier Zeichen an, anstatt die gesamte Zeichenkette rückwärts nach dem gesuchten Muster zu durchsuchen.


Anmelden zum Antworten