Hypercell ein ] Hypercell aus ] Zeige Navigation ] Verstecke Navigation ]
c++.de  
   

Die mobilen Seiten von c++.de:
http://m.c-plusplus.de
Infos hier [BETA]

  
c++.de :: DOS und Win32-Konsole (nur Lesen) ::  Brauche Hilfe beim MS-DOS filereader  
Gehen Sie zu Seite 1, 2  Weiter
  Zeige alle Beiträge auf einer Seite
Thema geschlossen
Autor Nachricht
Turbo_Freak
Mitglied

Benutzerprofil
Anmeldungsdatum: 17.05.2011
Beiträge: 11
Beitrag Turbo_Freak Mitglied 13:22:48 18.05.2011   Titel:   Brauche Hilfe beim MS-DOS filereader            Zitieren

Hallo Leute,

ich bin neu hier im Forum, sage "Hallo" :) und hoffe, ihr könnt mir helfen.

Ich bin dabei mir einen filereader für meinen alten Rechner zu bauen( Auf diesem läuft nur MS-DOS 6.22 ^^. Auf diese Weise bringe ich mir selbst am Besten einzelne Schritte im Programmieren bei ). Dafür benutze ich Turbo C++ 3.0. Wie ich eine Datei einlese und im Stil von MORE auf dem Bildschirm ausgebe beherrsche ich mittlerweile :). Nun probiere ich schon seit geschlagenen 3 Monaten den Inhalt einer Textdatei auf dem Bildschirm auf-/abwärts scrollen zu lassen, im Sinne von es werden die ersten 23 Zeilen einer Datei sofort ausgegeben, und beim drücken der Cursortasten scrollt der Inhalt entsprechend eine Zeile auf- bzw abwärts.

Diese Aufgabe macht mich langsam echt verrückt :( ...
Ich habe eine Methode in einem anderem Forum gefunden, also einen Quelltext, der das Scrollen vorführt, habe diesen ein bisschen modifiziert, allerdings ist jetzt das Einlesen einer kompletten Datei das Problem :( .

Hier einmal der Quelltext(nur ohne Filehandling):

[cpp]
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <conio.h>
#include <dos.h>

#define length(x) ( sizeof (x) / sizeof *(x) )

enum {
KEY_ESC = 27,
ARROW_UP = 256 + 72,
ARROW_DOWN = 256 + 80,
};

static char *text[] = {
"Line 1 Line 1 Line 1 Line 1 Line 1 Line 1 Line 1 Line 1 Line 1 Line 1 Line 1",
"Line 2 Line 2 Line 2 Line 2 Line 2 Line 2 Line 2 Line 2 Line 2 Line 2 Line 2",
"Line 3 Line 3 Line 3 Line 3 Line 3 Line 3 Line 3 Line 3 Line 3 Line 3 Line 3",
"Line 4 Line 4 Line 4 Line 4 Line 4 Line 4 Line 4 Line 4 Line 4 Line 4 Line 4",
"Line 5 Line 5 Line 5 Line 5 Line 5 Line 5 Line 5 Line 5 Line 5 Line 5 Line 5",
"Line 6 Line 6 Line 6 Line 6 Line 6 Line 6 Line 6 Line 6 Line 6 Line 6 Line 6",
"Line 7 Line 7 Line 7 Line 7 Line 7 Line 7 Line 7 Line 7 Line 7 Line 7 Line 7",
"Line 8 Line 8 Line 8 Line 8 Line 8 Line 8 Line 8 Line 8 Line 8 Line 8 Line 8",
"Line 9 Line 9 Line 9 Line 9 Line 9 Line 9 Line 9 Line 9 Line 9 Line 9 Line 9",
"Line 10 Line 10 Line 10 Line 10 Line 10 Line 10 Line 10 Line 10 Line 10",
"Line 11 Line 11 Line 11 Line 11 Line 11 Line 11 Line 11 Line 11 Line 11",
"Line 12 Line 12 Line 12 Line 12 Line 12 Line 12 Line 12 Line 12 Line 12",
"Line 13 Line 13 Line 13 Line 13 Line 13 Line 13 Line 13 Line 13 Line 13",
"Line 14 Line 14 Line 14 Line 14 Line 14 Line 14 Line 14 Line 14 Line 14",
"Line 15 Line 15 Line 15 Line 15 Line 15 Line 15 Line 15 Line 15 Line 15",
"Line 16 Line 16 Line 16 Line 16 Line 16 Line 16 Line 16 Line 16 Line 16",
"Line 17 Line 17 Line 17 Line 17 Line 17 Line 17 Line 17 Line 17 Line 17",
"Line 18 Line 18 Line 18 Line 18 Line 18 Line 18 Line 18 Line 18 Line 18",
"Line 19 Line 19 Line 19 Line 19 Line 19 Line 19 Line 19 Line 19 Line 19",
"Line 20 Line 20 Line 20 Line 20 Line 20 Line 20 Line 20 Line 20 Line 20",
"Line 21 Line 21 Line 21 Line 21 Line 21 Line 21 Line 21 Line 21 Line 21",
"Line 22 Line 22 Line 22 Line 22 Line 22 Line 22 Line 22 Line 22 Line 22",
"Line 23 Line 23 Line 23 Line 23 Line 23 Line 23 Line 23 Line 23 Line 23",
"Line 24 Line 24 Line 24 Line 24 Line 24 Line 24 Line 24 Line 24 Line 24",
"Line 25 Line 25 Line 25 Line 25 Line 25 Line 25 Line 25 Line 25 Line 25",
"Line 26 Line 26 Line 26 Line 26 Line 26 Line 26 Line 26 Line 26 Line 26",
"Line 27 Line 27 Line 27 Line 27 Line 27 Line 27 Line 27 Line 27 Line 27",
"Line 28 Line 28 Line 28 Line 28 Line 28 Line 28 Line 28 Line 28 Line 28",
"Line 29 Line 29 Line 29 Line 29 Line 29 Line 29 Line 29 Line 29 Line 29",
"Line 30 Line 30 Line 30 Line 30 Line 30 Line 30 Line 30 Line 30 Line 30",
"Line 31 Line 31 Line 31 Line 31 Line 31 Line 31 Line 31 Line 31 Line 31",
"Line 32 Line 32 Line 32 Line 32 Line 32 Line 32 Line 32 Line 32 Line 32",
"Line 33 Line 33 Line 33 Line 33 Line 33 Line 33 Line 33 Line 33 Line 33",
"Line 34 Line 34 Line 34 Line 34 Line 34 Line 34 Line 34 Line 34 Line 34",
"Line 35 Line 35 Line 35 Line 35 Line 35 Line 35 Line 35 Line 35 Line 35",
"Line 36 Line 36 Line 36 Line 36 Line 36 Line 36 Line 36 Line 36 Line 36",
"Line 37 Line 37 Line 37 Line 37 Line 37 Line 37 Line 37 Line 37 Line 37",
"Line 38 Line 38 Line 38 Line 38 Line 38 Line 38 Line 38 Line 38 Line 38",
"Line 39 Line 39 Line 39 Line 39 Line 39 Line 39 Line 39 Line 39 Line 39",
"Line 40 Line 40 Line 40 Line 40 Line 40 Line 40 Line 40 Line 40 Line 40",
"Line 41 Line 41 Line 41 Line 41 Line 41 Line 41 Line 41 Line 41 Line 41",
"Line 42 Line 42 Line 42 Line 42 Line 42 Line 42 Line 42 Line 42 Line 42",
"Line 43 Line 43 Line 43 Line 43 Line 43 Line 43 Line 43 Line 43 Line 43",
"Line 44 Line 44 Line 44 Line 44 Line 44 Line 44 Line 44 Line 44 Line 44",
"Line 45 Line 45 Line 45 Line 45 Line 45 Line 45 Line 45 Line 45 Line 45",
"Line 46 Line 46 Line 46 Line 46 Line 46 Line 46 Line 46 Line 46 Line 46",
"Line 47 Line 47 Line 47 Line 47 Line 47 Line 47 Line 47 Line 47 Line 47",
"Line 48 Line 48 Line 48 Line 48 Line 48 Line 48 Line 48 Line 48 Line 48",
"Line 49 Line 49 Line 49 Line 49 Line 49 Line 49 Line 49 Line 49 Line 49",
"Line 50 Line 50 Line 50 Line 50 Line 50 Line 50 Line 50 Line 50 Line 50"
};

static int get_code ( void )
{
int ch = getch();

if ( ch == 0 || ch == 224 )
ch = 256 + getch();

return ch;
}

static void redraw ( int start, int end )
{
int i;
textcolor(15); textbackground(0);
clrscr();

for ( i = start; i < end; i++ )
puts ( text[i] );
}

int main ( void )
{

int start = 0, end = 24;
int op = 0;

while ( redraw ( start, end ), ( op = get_code() ) != KEY_ESC ) {
switch ( op ) {
case ARROW_UP:
if ( start <= 0 ) {
//end = length ( text );
//start = end - 20;
start = 0;
}
else {
--start;
--end;
}
break;
case ARROW_DOWN:
if ( end >= length ( text ) ) {
//start = 0;
//end = start + 20;
end = length(text);
}
else {
++start;
++end;
}
break;
default: break;
}
}

return 0;
}
[/cpp]

Nun komme ich einfach auf keine Lösung dafür, wie man nun eine Datei in einem kompletten Stück einliest. 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ß :mad: . Ich komme einfach auf keine Lösung zu diesem Problem! :(
Ordentliche Beispiele bzw. Quelltexte an denen man sich orientieren kann finde ich nicht( ich suche täglich um die 3 - 4 Stunden ).

Bitte könnt ihr mir helfen? Ein Link aus einem Forum, in welchem die selbe Frage beantwortet wurde, Methoden mit kleinem Beispiel, wie ich das Problem noch lösen könnte, irgendwie .. :(

Vielen Dank euch im Voraus und ich hoffe durch eure Hilfe kriege ich Klarheit, was diese Aufgabe angeht.
f.-th.
Unregistrierter




Beitrag f.-th. Unregistrierter 15:36:52 18.05.2011   Titel:              Zitieren

Von den folgenden Editoren sollten einige mit Quelltext sein:
http://texteditors.org/cgi-bin/wiki.pl?MsDosEditors

Hab nix getestet.

MfG f.-th.
IOCC
Unregistrierter




Beitrag IOCC Unregistrierter 16:32:04 18.05.2011   Titel:              Zitieren

Das mach mal lieber erstmal mit einer Biosfunktion, Int 10h Funktion 6 usw.
Turbo_Freak
Mitglied

Benutzerprofil
Anmeldungsdatum: 17.05.2011
Beiträge: 11
Beitrag Turbo_Freak Mitglied 17:35:56 18.05.2011   Titel:              Zitieren

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.
:D

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:

[cpp]
#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,&regs,&regs);
}

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,&regs,&regs);
}

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;
}
[/cpp]

Die oberste und unterste Zeile wird immer einfach nur mit Leerzeichen gefüllt..
f.-th.
Unregistrierter




Beitrag f.-th. Unregistrierter 18:50:04 18.05.2011   Titel:              Zitieren

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_Vision

MfG f.-th.
Turbo_Freak
Mitglied

Benutzerprofil
Anmeldungsdatum: 17.05.2011
Beiträge: 11
Beitrag Turbo_Freak Mitglied 19:03:31 18.05.2011   Titel:              Zitieren

Hey ^^ .. also ich habe auch nochmal alle Beispiele von Turbo C/Turbo C++ aus der dazugehörigen Onlinehilfe nachgeschlagen, allerdings auch da nichts gefunden :P
..

Und Calvin sah ungefähr so aus oder wie meinst du? Wenn ja dann sollte ich mir den vielleicht mal genauer angucken :D
f.-th.
Unregistrierter




Beitrag f.-th. Unregistrierter 20:40:58 18.05.2011   Titel:              Zitieren

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.
Turbo_Freak
Mitglied

Benutzerprofil
Anmeldungsdatum: 17.05.2011
Beiträge: 11
Beitrag Turbo_Freak Mitglied 09:48:44 19.05.2011   Titel:              Zitieren

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)

[cpp]
typedef struct
{
char *line;
} Inhalt;

Inhalt textfile[2000];
[/cpp]

Tat sich nichts.

Vielen Dank :)
DirkB
Unregistrierter




Beitrag DirkB Unregistrierter 11:50:41 19.05.2011   Titel:              Zitieren

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
Turbo_Freak
Mitglied

Benutzerprofil
Anmeldungsdatum: 17.05.2011
Beiträge: 11
Beitrag Turbo_Freak Mitglied 13:19:41 19.05.2011   Titel:              Zitieren

Hallo und Danke DirkB :),
habe mich schon die ganze Zeit gefragt, warum der Code bei mir nicht im Kasten dargestellt wird :D .

Kannst du mir vielleicht ein Beispiel im Bezug auf mein Problem geben ?
Also mit malloc() ...

Danke dir
c++.de :: DOS und Win32-Konsole (nur Lesen) ::  Brauche Hilfe beim MS-DOS filereader  
Gehen Sie zu Seite 1, 2  Weiter
Thema geschlossen

Zeige alle Beiträge auf einer Seite




Nächstes Thema anzeigen
Vorheriges Thema anzeigen
Sie können Beiträge in dieses Forum schreiben.
Sie können auf Beiträge in diesem Forum antworten.
Sie können Ihre Beiträge in diesem Forum nicht bearbeiten.
Sie können Ihre Beiträge in diesem Forum nicht löschen.
Sie können an Umfragen in diesem Forum nicht mitmachen.

Powered by phpBB © 2001, 2002 phpBB Group :: FI Theme

c++.de ist Teilnehmer des Partnerprogramms von Amazon Europe S.à.r.l. und Partner des Werbeprogramms, das zur Bereitstellung eines Mediums für Websites konzipiert wurde, mittels dessen durch die Platzierung von Werbeanzeigen und Links zu amazon.de Werbekostenerstattung verdient werden kann.

Die Vervielfältigung der auf den Seiten www.c-plusplus.de, www.c-plusplus.info und www.c-plusplus.net enthaltenen Informationen ohne eine schriftliche Genehmigung des Seitenbetreibers ist untersagt (vgl. §4 Urheberrechtsgesetz). Die Nutzung und Änderung der vorgestellten Strukturen und Verfahren in privaten und kommerziellen Softwareanwendungen ist ausdrücklich erlaubt, soweit keine Rechte Dritter verletzt werden. Der Seitenbetreiber übernimmt keine Gewähr für die Funktion einzelner Beiträge oder Programmfragmente, insbesondere übernimmt er keine Haftung für eventuelle aus dem Gebrauch entstehenden Folgeschäden.