Wie aktuelle Zeile ab bestimmter Stelle löschen?



  • Das ist eher eine Frage für das Konsolenforum. In der dortigen FAQ gibt es z.Bsp. das hier.
    http://www.c-plusplus.net/forum/viewtopic-var-t-is-86429.html



  • Dieser Thread wurde von Moderator/in HumeSikkins aus dem Forum C++ in das Forum DOS und Win32-Konsole verschoben.

    Im Zweifelsfall bitte auch folgende Hinweise beachten:
    C/C++ Forum :: FAQ - Sonstiges :: Wohin mit meiner Frage?

    Dieses Posting wurde automatisch erzeugt.



  • Gibt es hier nicht ne Möglichkeit mit dem Steuerzeichen "\r" zurück in die letzte zeile zu springen und nur die Eingabe zu löschen bzw. mit " " auffüllen, also ab prompt.length() ???



  • So würde es funktionieren:
    Die Verwendung von system("CLS") ist aber bestimmt nicht gerade das gelbe vom Ei...

    #include <iostream>
    #include <cstdlib>
    #include <string>
    
    int main(void){
    	std::string input;
        do{
    		std::cout<<"Prompt:>";
    		std::cin>>input;
    		system("CLS");
        }while(!(input=="EXIT" || input=="exit"));
    }
    


  • Ich hab eher an eine Funktion gedacht die nach der Prompt alles löscht, hab schon was probiert:

    void clearLineAt(string prompt)
    {
    	cout.put( '\r' );
    
    	//Lösche alles ab der Prompt bis zum Ende der Konsole (Improved Console)
    	for( string::size_type i = prompt.length(); i < con.getWndSizeX() ; ++i )
    	{
    		cout.put( ' ' );
    	}
    }
    

    Aber die Prompt wird auch überschrieben 😡



  • Mit der Improved Console geht das ohne probleme:

    #include <string>
    #include <iostream>
    
    #include <ic.hpp>
    
    namespace ic {
    
    	void clreol( Console &con ) { // clear till end of line
    
    		COORD origin = { con.getCurPosX( ), con.getCurPosY( ) };
    		DWORD chars_written;
    		FillConsoleOutputCharacter( GetStdHandle( STD_OUTPUT_HANDLE ), ' ', con.getWndBufSizeX() * con.getWndBufSizeY(), origin, &chars_written );
    	}
    }
    
    int main()
    {
    
    	std::string input;
    	std::string prompt = "Prompt:>";
    
    	std::cout << prompt;
    
    	while( true ) {
    
    		std::getline( std::cin, input );
    
    		ic::con.setCurPos( prompt.length( ), 0 );
    		ic::clreol( ic::con );
    	}
    
    	return 0;
    }
    

    greetz, Swordfish



  • Danke Dir, hast mir wirklich weitergeholfen 🙂

    Ein Problem habe ich aber, habe versucht die Improved Console Sources in ein anderes Projekt einzubinden und zu kompilieren und bekomme plötzlich diese Linkerfehler:

    1>ic.obj : error LNK2001: Nicht aufgelöstes externes Symbol "__imp__ShowWindow@8".
    1>ic.obj : error LNK2001: Nicht aufgelöstes externes Symbol "__imp__SetWindowPos@28".
    1>ic.obj : error LNK2001: Nicht aufgelöstes externes Symbol "__imp__GetWindowRect@8".

    Hab VC++ 2008 Express Edition, hab die beiden Dateien im gleichen Verzeichnis und im Projekt mit eingebunden, davor hats ja auch geklappt wieso jetzt nicht??



  • Das mit den Linkerfehler hat sich erledigt einfach das einbinden:

    #pragma comment(lib, "user32.lib")
    

    Wie kann man nun prüfen ob sich die Y Zeile verändert hat, also wenn ein längerer Text eingegeben wird und am Ende der Zeile in die nächste gesprungen wird??



  • ic::con.getCurY( ) .

    greetz, Swordfish



  • Nagut dann werd ich mal meine Probleme konkretisieren, ich habe ja eine eigene getline() Funktion geschrieben, ich habe paar Fehler gefunden wenn die Eingabe über die Zeile hinausgeht, also in die nächste Zeile gesprungen wird dann wird die Ausgabe nicht richtig verarbeitet:

    string GetKeyInputString(string Prompt)
    {
    	//Cursor Position
    	int textpos = 0;
    	int key, x, y, currentPosition;	
    	string input;
    	int LineSize;
    
    	//Handle für x,y Koordinaten
    	HANDLE std_output = GetStdHandle( STD_OUTPUT_HANDLE );
    	CONSOLE_SCREEN_BUFFER_INFO console_screen_buffer_info;  
    
    	do
    	{
    		key = _getch( );
    		switch(key)
    		{			
    
    		case BACKSPACE:
    			if(textpos > 0)
    			{						
    				input.erase(textpos-1, 1);
    				cout.put(' ');	
    
    				GetConsoleScreenBufferInfo( std_output, &console_screen_buffer_info );
    				y = console_screen_buffer_info.dwCursorPosition.Y;
    
    				ic::con.setCurPos( Prompt.length( ), y );
    				ic::clreol( ic::con ); 
    				cout << input;
    
    				currentPosition = Prompt.length() + textpos;
    				gotoxy(currentPosition-1, y); 
    				textpos--;		
    				break;
    			}
    
    			if(textpos == 0)
    			{
    				cout.put(' ');
    				GetConsoleScreenBufferInfo( std_output, &console_screen_buffer_info );
    				y = console_screen_buffer_info.dwCursorPosition.Y;
    
    				currentPosition = Prompt.length() + textpos;
    				gotoxy(currentPosition, y); 
    				break;
    			}					
    
    		case ENTER:		
    			break;	
    
    		case LEERTASTE:
    
    			//Wenn in die nächste Zeile gesprungen wird
    			if( (Prompt.length() + input.length()) > ic::con.getWndBufSizeX() )
    			{
    				input.insert(textpos, " "); 
    
    				GetConsoleScreenBufferInfo( std_output, &console_screen_buffer_info );
    				y = console_screen_buffer_info.dwCursorPosition.Y;
    
    				int rest = (Prompt.length() + input.length()) - ic::con.getWndBufSizeX();
    
    				gotoxy(rest, y); 
    				textpos++; 
    			}
    			else
    			{			
    				input.insert(textpos, " "); 
    
    				GetConsoleScreenBufferInfo( std_output, &console_screen_buffer_info );
    				y = console_screen_buffer_info.dwCursorPosition.Y;
    
    				currentPosition = Prompt.length() + textpos;
    				gotoxy(currentPosition+1, y);  
    				textpos++;       
    			}
    
    			break;		
    
    		case STEUERZEICHEN:
    
    			switch( _getch() )
    			{	
    
    			case PFEIL_LINKS: // Pfeiltaste nach Links      
    				if(textpos > 0)
    				{	
    					GetConsoleScreenBufferInfo( std_output, &console_screen_buffer_info );
    					y = console_screen_buffer_info.dwCursorPosition.Y;
    
    					currentPosition = Prompt.length() + textpos;
    					gotoxy(currentPosition-1, y);  
    					textpos--;
    
    				}break;
    
    			case PFEIL_RECHTS: // Pfeiltaste nach Rechts: 
    				if(textpos < input.length() )
    				{
    					GetConsoleScreenBufferInfo( std_output, &console_screen_buffer_info );
    					y = console_screen_buffer_info.dwCursorPosition.Y;
    
    					currentPosition = Prompt.length() + textpos;
    					gotoxy(currentPosition+1, y);  
    					textpos++; 
    
    				}break;
    
    			case DELETE:
    				if(input.length() > 0)
    				{	
    					input.erase(textpos, 1 );
    
    					GetConsoleScreenBufferInfo( std_output, &console_screen_buffer_info );
    					y = console_screen_buffer_info.dwCursorPosition.Y;
    
    					ic::con.setCurPos( Prompt.length( ), y );
    				    ic::clreol( ic::con );
    					cout << input;					
    
    					currentPosition = Prompt.length() + textpos;
    					gotoxy(currentPosition, y);
    
    				}break;
    
    			}break;
    
    		default:
    
    			string tmp;
    			GetConsoleScreenBufferInfo( std_output, &console_screen_buffer_info );
    			y = console_screen_buffer_info.dwCursorPosition.Y;
    
    			//An bestimmter Stelle im String wird neues Zeichen eingefügt
    			if(textpos < input.length() )
    			{		
    				tmp = key;
    				input.insert(textpos, tmp);				
    			}
    
    			else
    			{				
    				input += key;
    				cout.put( key );				
    			}
    			currentPosition = Prompt.length() + textpos;
    			gotoxy(currentPosition+1, y);  
    			textpos++;
    		}
    
    	}while( key != ENTER );
    
    	cout << endl;
    
    	if( input.length() != 0)
    	{				
    		//cout << "Input: [" << input << "] CursorPos: " << textpos << endl << endl;
    		return TrimSpaces(input);	
    	}
    	return "";
    }
    

    Alles wird solange richtig gemacht wenn ich noch in der ersten Zeile bin, aber wenn ich hinausschreibe dann klappt es nicht wie in der ersten Zeile 😞

    Habe bei der LEERTASTE folgendes ausprobiert:

    if( (Prompt.length() + input.length()) > ic::con.getWndBufSizeX() )
    ...
    

    Die Breite beträgt 80 und wenn nun die Prompt- und Eingabelänge größer sind dann sollen die Koordinaten neu geschrieben werden, aber es klappt nur in der zweiten Zeile, aber wie soll man das machen mit den anderen, dann ist ja die Breite 160 usw.





  • Der einfachste Weg wäre hier mit gotoxy() zu arbeiten.

    Bibliothek: include "conio.h"

    Unterprogramm:

    void gotoxy(int x, int y) 
    { 
        COORD c = { x, y }; 
        SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE), c); 
    }
    

    Im Hauptprogramm Baust du einfach gotoxy(x,y) irgendwo ein. x steht für zeichennummer in der zeile und y für die zeile.

    da es sich um eine parameterübergabe handelt, brauchst du den zahlenwert nicht im unterprogramm hinschreiben.

    mit clrscr() flackert der bildschirm bei schnellen wechseln extrem 😉


Anmelden zum Antworten