Brauche Hilfe beim MS-DOS filereader
-
Vielen Danke für eure Antworten .
f.-th. danke für den Link. Ich habe mir den Quelltext zum Editor Calvin gezogen, allerding habe ich sehr schnell gemerkt, dass dieser Quelltext noch zu viel für mein kleines Brain ist, denn ich kann in dem Quelltext echt nichts nachvollziehen.
IOCC ich habe es mal mit der BIOSfunktion int 10h versucht. Nur beim Scrollen, sagen wir mal ich habe 24 zeilen Text und ich scrolle einmal nach oben und anschließend wieder runter, dann ist die oberste Zeile vom Text weg. ^^
Ich mache da bestimmt mindestens einen Fehler, aber ich weiß nicht wo genau.Hier ist der Quelltext:
#include <conio.h> #include <dos.h> #include <stdio.h> enum { ESC = 27, UP = 256 + 72, DOWN = 256 + 80, }; static int get_key(void) { int ch = getch(); if(ch == 0 || ch == 224) ch = 256 + getch(); return ch; } union REGS regs; void scroll_up(void) { regs.h.ah = 6; regs.h.al = 1; regs.h.bh = 0; regs.h.ch = 1; regs.h.cl = 1; regs.h.dh = 25; regs.h.dl = 80; int86(0x10,®s,®s); } void scroll_down(void) { regs.h.ah = 7; regs.h.al = 1; regs.h.bh = 0; regs.h.ch = 1; regs.h.cl = 1; regs.h.dh = 25; regs.h.dl = 80; int86(0x10,®s,®s); } int main() { clrscr(); FILE *f; f=fopen("C:\\RAR.TXT","r"); char *line; while(!feof(f)) { fgets(line, 80, f); printf("%s",line); } fclose(f); getch(); int key=0; while((key = get_key()) != ESC) { switch(key) { case UP: scroll_up(); break; case DOWN: scroll_down(); break; default: ;break; } } return 0; }
Die oberste und unterste Zeile wird immer einfach nur mit Leerzeichen gefüllt..
-
Ist schon länger her. Ist das Beispiel woran ich mich zu erinnern glaube, bei den Beispielen von Turbo C dabei oder hatte ich das irgend wo extern gefunden?
Sollte etwa so aussehen wie der Turbo-C-Editor allerdings ohne den compilerspezifischen Kram
Sah etwa so aus:
http://de.wikipedia.org/wiki/Turbo_VisionMfG f.-th.
-
Hey ^^ .. also ich habe auch nochmal alle Beispiele von Turbo C/Turbo C++ aus der dazugehörigen Onlinehilfe nachgeschlagen, allerdings auch da nichts gefunden
..Und Calvin sah ungefähr so aus oder wie meinst du? Wenn ja dann sollte ich mir den vielleicht mal genauer angucken
-
Für das Scrollen gibt es verschiedene Lösungen.
DOS musste ja auf die etwa 64k grossen Dateisegmente Rücksicht nehmen.
Also, wenn der Quelltext da rein passt, einlesen und dann schiebst du halt den Focus rauf oder runter.So weit was mir da noch einfällt.
MfG f.-th.
-
Guten Morgen
danke für die Info f.-th.. Mein Problem an der Sache ist nur, dass ich keine Ahnung habe, wie ich den von dir genannten Weg in Code umsetzen kann.Ich weiß weder, wie ich eine ganze Datei als Segment einlesen kann, noch wie ich demnach den Fokus bestimme. Also da das mit dem 2D-Array zum Beispiel nicht funktionierte .. -.- , damit wäre das ganze für mich eigentlich kein Problem gewesen. :p
Wenn ich jetzt zum Beispiel versucht habe, eine Struktur zu benutzen, um eine Datei einzulesen, die wie folgt aussah(nur zum Test, da schon das 2D-Array mit a[100][81] zu 'groß' war)
typedef struct { char *line; } Inhalt; Inhalt textfile[2000];
Tat sich nichts.
Vielen Dank
-
Für solche Sachen ist die Dynamische Speicherverwaltung da. malloc() und co ist dein Freund.
Du kannst doch erstmal die Datei durchsuchen und immer die Position eines Zeilenanfangs in einem Array Speichern. (mit ftell() )Dann brauchst du nur noch an die Position zu springen (mit fseek() ) und von da aus die Datei ausgeben.
Es gibt auch das Speichermodell Huge. Damit kannst du auch Arrays > 64k verwalten.
PS.: Schau mal ob bei dir unter den Smilies ein Haken vor BBCode in diesem Beitrag deaktiviere steht. Und dann mach ihn weg
-
Hallo und Danke DirkB :),
habe mich schon die ganze Zeit gefragt, warum der Code bei mir nicht im Kasten dargestellt wird .Kannst du mir vielleicht ein Beispiel im Bezug auf mein Problem geben ?
Also mit malloc() ...Danke dir
-
Turbo_Freak schrieb:
Ich habe es mit einem zweidimensionalen Array versucht, aber schon bei dieser Größe 'char A[100][81];' sagt mir der Compiler, das Array ist zu groß . Ich komme einfach auf keine Lösung zu diesem Problem!
Das kann nicht sein.
8100 Bytes am Stück sollten selbst für TC3 kein Problem sein.
Und wie man Textdateien zeilenweise in ein Stringarray schreibt, steht in jedem besseren Beitrag hier und auch bei diversen Suchmaschinen.
-
Habe das jetzt nicht getestet:
Wie Dirk schon schrieb richtiges Speichermodell wählen/in der IDE einstellen.
In der IDE nachsehen wie die Speichergrössen voreingestellt sind und entsprechend anpassen. Ohne Gewähr -> Voreinstellung nur 4k?MfG f.-th.
-
Hab gerade mal etas im Code von Calvin gestöbert. Bevor man was anzeigen kann muss man erstmal wissen wieviele Zeichen in eine Zeile passen und wieviele Zeilen zu sehen sind.
Calvin macht das so:
mov ah,15 ;get current video state int 10h mov dl,24 ;dl = number of rows - 1 cmp al,7 je inv1 ;if B/W text card push ax push cx mov ax,1130h ;get number of rows int 10h pop cx pop ax cmp dl,MAXROWS
Und natürlich wird nicht der langsamste Befehl der ANSI Bibliothek verwendet sondern der Text wird direkt in den Videospeicher geschrieben - Speicher dafür braucht man also schonmal nicht allokieren
mov word vidseg,0b000h
Wobei ich meinem VGA-Buch entnehme, das ein Farbmonitor im Textmodus
eigentlich B800h verwendetNaja, das wird bedeuten das der vi-Clone (genau wie sein Vorbild) keine
Farben verwendet...Ausserdem ist vi ja nicht gerade für seine Benutzerfreundlichkeit bekannt.
Eines der massgeblichsten Probleme wird allerdings sein die Zeilenanfänge zu
verwalten, vor allem wenn man eine Datei "am Stück" einliest. Wie gross sind eigentlich die anzuzeigenden Dateien ? Wenn die nicht in ein Segment passen
sollten wirds nochmal komplizierter.
-
Ein guter Ansatz wäre eventuell auch dieser Editor mit Quelltext
für Borland Compiler. Habe ich aber nicht getestet!OSPlus Text Editor 2.1.1 (31st March 2005)
http://www.owenrudge.net/osplus/
http://sourceforge.net/projects/osplus/files/Text%20Editor/2.1.1/
-
Danke für deine Antwort merano,
nun die Datei, mit der ich anfänglich arbeite ist ~65Kb groß. Diese größe reicht auch total aus fürs erste.