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
-
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
-
Ah ok, danke für die schnelle Hilfe.
SmileStyle
-
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:
-
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.
-
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.