[gelöst][LowLevel]Eingabe korrigieren mit char(16)
-
Hi all,
ich habe mir überlegt mal ein wenig auf den Low-Level-Dateizugriff auszuwander damit ich dass auch mal lerne.Es klappt ganz gut, nur gerade versuche ich eine Pfadeingabe zu realisieren:
loleReadUntilReturn( filePath, 255 ); [...] int loleReadUntilReturn( char *read, int maxLength ) /* This function will read the STDIN file until it reads a '\n' The returnValue is 0 if the function reached the maximal lenght (given by maxLength) or >0 if the function reached a '\n', the return value will be the length of read characters */ { int i = 0, returnValue = 0; //read as much characters as the read character is an '\n' or the maximal length is reached while( i < maxLength-1 && '\r' != (read[i] = getch()) ) { if( 16 != read[i] ) { write( STDOUT, read+i, 1 ); i++; } else { read[i] = 32; goBackward( 57 + i ); write( STDOUT, read+i-1, 1 ); goBackward( 57 + i ); read[i] = 0; i--; } } read[i+1] = 0; //if the maximal length isnt reach (important for the return value) if( i != maxLength-1 ) returnValue = i+1; return returnValue; } void goBackward( int aktXPos ) { HANDLE consolHandle; COORD newPos; consolHandle = GetStdHandle( STD_OUTPUT_HANDLE ); //go one character backward newPos.X = aktXPos - 1; SetConsoleCursorPosition( consolHandle, newPos ); }
vorher hieß die goBackward Funktion eigentlich eraseLast, aber ich konnte den Buchstaben nicht überschreiben,
dann habe ich sie auf goBackward umbenannt, und den rest in loleReadUntilReturn gelegt.Mein Problem:
Wenn ich BACKSPACE drücke geht er ja ganz nett einen Buchstaben zurück ABER:
-Der letzte buchstabe wird nicht mit einem " " überschrieben
-der String geht trotzdem bis zu seinem ende, wo er vorher war.Wieso? Ich verstehe dass irgendwie nicht...
Kann mir da jemand bitte Helfen
-
ich vermutte den Fehler hier:
//read as much characters as the read character is an '\n' or the maximal length is reached while( i < maxLength-1 && '\r' != (read[i] = getch()) ) {
i < maxLength anstatt i < maxLength-1
'\r' in den Kommentar steht etwas von '\n'
------
-
Jop, dass stimmt, aber wenn ich \n anstatt \r schreibe, registriert er dass nicht.
Werde dass Kommtenar aber auf jeden fall umschreiben.Wieso sollte der Fehler etwas mit der Abbruchbedingung meiner schleife zu tun haben?
i < maxLength-1
wegen
read[i+1] = 0;
Wenn der Buffer schon voll währe, könnte ichnicht an die nächste Stelle ein HEX:0 schreiben.
Ohne diese 0 würde der string nicht beendet werdern, was zu fehlern kommt...
Jetzt die frage:
Wieso geht das:
} read[i+1] = 0; //if the maximal leng...
und das nicht:
goBackward( 57 + i ); read[i] = 0; i--;
Versteh icht nicht
C:\cprogs>loleCopy File created "myLowLevelFile.llf" in current *.exe Path Please fill in the path of the file, or just the name: frekatdil You've entered: frekatdil This file doesn't exist
Ich habe was eingegeben und dann 3 BACKSPACE und dann di geschrieben, ENTER und fertig.
Wieso zeigt er mir anYou've entered: frekatdil
das 'l' dürfte da doch gar nicht mehr sein oder?
-
if( 16 != read[i] )
Hi, was soll denn die 16 (DLE = Data Link Escape) dort?
goBackward( 57 + i );
write( STDOUT, read+i-1, 1 );Was soll denn die 57 sein?
Und sollte es nicht eher &read[i], d.h. read+i heißen?
Und folgendes fällt mir zu guter Letzt auch noch auf:
while(...)
{}
read[i+1] = 0; // i könnte jetzt maxLength sein, d.h. außerhalb des PufferbereichsEs klappt ganz gut, nur ...
-
Th schrieb:
if( 16 != read[i] )
Hi, was soll denn die 16 (DLE = Data Link Escape) dort?
Darum dreht sich alles... dass ist backspace.
Th schrieb:
Was soll denn die 57 sein?
Dass ist die Länge von:
Please fill in the path of the file, or just the name:
^^ist nicht variable genug ich weiss
Th schrieb:
while( i < maxLength-1 )//manchmal sollte man auf bedingungen achten
{}
read[i+1] = 0; // i könnte jetzt maxLength sein, d.h. außerhalb des PufferbereichsmaxLength = 55;
while( i < 55-1 && ... )( i < 55 = 54 - 1 = 53)
{
...
}(i = 53)
read[53+1] = 0;(53+1 = 54)[edit]
lippoliv schrieb:
Es klappt ganz gut, nur...
war auf low-level-dateizugriff gemeint, nicht das rumspringen in der konsole oder das Programm an sich. :p
[edit2]
16 != backspace....
was ist den backspace überhaupt???? 8?
-
lippoliv schrieb:
Ich habe was eingegeben und dann 3 BACKSPACE und dann di geschrieben, ENTER und fertig.
Wieso zeigt er mir an
Code:
You've entered: frekatdildas 'l' dürfte da doch gar nicht mehr sein oder?
read[i] == backspace.
else { read[i-1] = ' '; // read[i] = 32; goBackward( 57 + i ); write( STDOUT, read+i-1, 1 ); goBackward( 57 + i ); read[i] = 0; i--; }
-
Leider nein.
Irgendwie passiert jetzt folgendes:
im Array wird alles richtig gemacht,
aber auf der Kommandozeile geht er keinen schritt zurück!?Wieso?
void goBackward( int aktXPos ) { HANDLE consolHandle; COORD newPos; consolHandle = GetStdHandle( STD_OUTPUT_HANDLE ); //go one character backward newPos.X = aktXPos - 1; SetConsoleCursorPosition( consolHandle, newPos ); }
-
Er muss 2 mal zurück springen einmal das zu löschende zeichen und einmal das backspace zeichen.
else { read[i-1] = ' '; // read[i] = 32; goBackward( 57 + i ); write( STDOUT, read+i-1, 1 ); read[i] = 0; i--; }
und in der funktion goBackward
newPos.X = aktXPos - 2;
oder bin ich auf dem holzweg?
PS: ich würde die Eingabe von der Verarbeitung trennen,
dann ist es übersichtlicher.
-
Naja wenn ich erst 2 mal zurückspringe würde ich 2 zeichen löschen, ich mus 2 * 1 mal zurückspringen und zwischen drinne was machen
void goBackward( int aktXPos ) { HANDLE consolHandle; COORD newPos; CONSOLE_SCREEN_BUFFER_INFO psbi; consolHandle = GetStdHandle( STD_OUTPUT_HANDLE ); GetConsoleScreenBufferInfo( consolHandle, &psbi ); //go one character backward newPos.X = psbi.dwCursorPosition.X - 1; newPos.Y = psbi.dwCursorPosition.Y; SetConsoleCursorPosition( consolHandle, newPos ); }
^^ richtig: scheint wohl so, als ob man immer X und Y übergeben müsste.