fstream nimmt den Rückgabewert von readline nicht an (Linux)
-
Hallo ich bin neu hier im Forum und auch bei C++.
Was ich bis heute so versucht habe war eine kleine Konsolenanwendung welche lediglich eine Datei öfnnet und wieder Zeilenweise ausgibt wobei die Ausgabe auf Zeilen beschränkt ist welche nur Zahlen enthalten. Dies war nicht so schwierig .. leider hat es mich genervt immer den kompletten Dateinamen anzugeben ... also habe ich mit mit der readline Lib angfreundet. Das hat funktioniert aber irgendwie bekomme ich nun fstream nicht mehr dazu die datei zu öfnnen deren Dateinamen ich über readline() einglesen hab ... undas obwohl ich mich an char* sowohl für readline und auch fstream gehalten hab ... vielleicht könnt ihr mir ein wenig helfem?/* This simple program shows how to read a file whose filename is specified by the user and autocompleted and how each line of the file which contains solely numbers is printed on the screen */ #include <iostream> #include <fstream> #include <stdio.h> #include <stdlib.h> #include <ctype.h> #include <readline/readline.h> #include <readline/history.h> char* line_read; void lineOutput( std::fstream& stream ); //the function which displays each line on the screen char* rl_gets(); int main() { std::cout << "Please enter a filename: \n"; std::fstream inputfile; const char* filename = rl_gets(); inputfile.open(filename, std::ios::in); if( !(inputfile) ){ std::cerr << "ERROR: Cannot open file!" <<"\n"; } lineOutput(inputfile); //line by line output function return 0; } void lineOutput (std::fstream& stream){ char buffer[512]; int cnt=1; while( stream.getline(buffer, sizeof(buffer)) ){ if( stream.fail() ){ std::cout << "Unexpected ERROR ! ! !" << std::endl; break; } if(isdigit(buffer[0])){ // this conditions tests if the char contains numbers std::cout << cnt++ << " : " << buffer << std::endl; } } } char* rl_gets () { line_read = readline (""); return (line_read); }Zeile 24 hätte ich mir sparen können aber ich wollte auf nummer sicher gehen. Das Program läuft aber fstream kann die Datei nicht öffnen ... habe auch mehrere verschiedene Dateinen (mit und ohne Dateiendung) ausprobiert.
Ich bin ein wenig ratlos.
Grüße + Vielen Dank!
glycylalanin :xmas1:
-
Funktioniert bei mir.
-
Ahhhh ....
bei mir funktioniert es auch aber NUR wenn ich die Datei eintippe ...nicht wenn ich die Autocompletionfunktion nutze (also ein-zwei Buchstaben dann TAB dann ENTER). Hmmm .... d.h. das das was von readline zurückgegeben wird irgendwie zwar gleich aussieht wenn man sichs mit cout ausgeben lässt aber nicht das gleiche ist wie wenn man's eintippt?Grüße und Danke!
-
ich habe gerade entdeckt, dass wenn man sich mit readline + TAB einen Dateinamen versvollständigen lässt am Ende ein Leerzeichen oder gar der TAB selbst angehängt wird, wenn man aber das ganze nur eintippt geschieht das natürlich nicht. Aber wie kann ich verhindern das der TAB als Zeichen miteingelesen wird?
Grüße,
glycylalanin
-
glycylalanin schrieb:
Ahhhh ....
bei mir funktioniert es auch aber NUR wenn ich die Datei eintippe ...nicht wenn ich die Autocompletionfunktion nutze (also ein-zwei Buchstaben dann TAB dann ENTER). Hmmm .... d.h. das das was von readline zurückgegeben wird irgendwie zwar gleich aussieht wenn man sichs mit cout ausgeben lässt aber nicht das gleiche ist wie wenn man's eintippt?Grüße und Danke!
Kann ich nicht nachvollziehen. Bist du sicher, dass der vervollständigte Name eindeutig auf eine Datei verweist?
-
ja ... ich hab mir in Zeile 11 und 12 (siehe unten) die beiden variablen nochmal ausgeben lassen. Wenn Du also eine Datei bsp. test.txt so eingibst te+TAB+ENTER dann befindet sich Platz zwischen dem ausgegebenen Dateinamen und dem senkrechten Strich. Der Platz verscwindet wenn du gleich test.txt+ENTER eingibst. Dann findet fstream die Datei auch.
int main() { std::cout << "Please enter a filename: \n"; std::fstream inputfile; rl_gets(); const char *filename = line_read; inputfile.open(filename, std::ios::in); if( !(inputfile) ){ std::cerr << "ERROR: Cannot open " <<filename <<"!" <<"\n"; } std::cerr<<line_read <<"|" <<"\n"; std::cerr<<filename <<"|" <<"\n"; lineOutput(inputfile); //line by line output function return 0; }
-
Ok, das kann ich nachvollziehen. Kurzes Googlen ergibt, dass du wohl
rl_completion_suppress_appendsetzen musst. Wie das genau geht musst du selbst heraus finden, ich lese nicht die gesamte Anleitung für dich.
-
würd ich auch nicht verlangen ...VIELEN DANK!

-
while( stream.getline(buffer, sizeof(buffer)) ){ if( stream.fail() ){ std::cout << "Unexpected ERROR ! ! !" << std::endl; break; } ...Auf fail zu prüfen ist unsinnig da der Punkt nie erreicht wird.