Προς το περιεχόμενο

Προσομοίωση της more σε C


rebel2000

Προτεινόμενες αναρτήσεις

Δημοσ.

Έχω να κάνω μια εργασία που ονομάζετε προσομοίωση της εντολής more του DOS που να εμφανίζει την καθιερωμένη είσοδο σελίδα σελίδα,με πρόγραμμα σε γλώσσα C.

Επειδή όμως το επίπεδο μου στη C είναι ακόμα αρκετά χαμηλό θα ήθελα την βοηθεια σας!!

Δημοσ.
random

said:

Χωρις παρεξηγηση, μηπως ξέρεις basic?

αν ναι, πάρε εναν translator basic to c, http://bcx.basicguru.com/

και εναν c compiler http://www.cs.virginia.edu/~lcc-win32/

 

δυστυχώς δεν ξερω κι εγω C.

 

LOL. Poli kalos random. <img src="http://www.insomnia.gr/ubbthreads/images/graemlins/smile.gif" alt="" /> me ekanes kai gelasa proi proi.

 

File ta pragmata gia esena einai poli apla. Bres ena mixanima unix. Psakse sta source kai pare ton kodika tis more etoimo <img src="http://www.insomnia.gr/ubbthreads/images/graemlins/wink.gif" alt="" />

Δημοσ.
JPG

said:

random

said:

Χωρις παρεξηγηση, μηπως ξέρεις basic?

αν ναι, πάρε εναν translator basic to c, http://bcx.basicguru.com/

και εναν c compiler http://www.cs.virginia.edu/~lcc-win32/

 

δυστυχώς δεν ξερω κι εγω C.

 

LOL. Poli kalos random. <img src="http://www.insomnia.gr/ubbthreads/images/graemlins/smile.gif" alt="" /> me ekanes kai gelasa proi proi.

 

File ta pragmata gia esena einai poli apla. Bres ena mixanima unix. Psakse sta source kai pare ton kodika tis more etoimo <img src="http://www.insomnia.gr/ubbthreads/images/graemlins/wink.gif" alt="" />

 

Pisteueis o kathigitis i o ergastiriakos den tah to exei skeftei ayto? <img src="http://www.insomnia.gr/ubbthreads/images/graemlins/smile.gif" alt="" />

Δημοσ.

Ευχαριστώ για τις απαντήσεις αλλά απο τη μία τα zip δεν με βοήθησαν ιδιαίτερα ενώ να πάρω τον κώδικα έτοιμο είναι κάτι το οποίο δεν γίνετε γιατι θα εξεταστώ σ'αυτό.

Αν έχετε υπόψιν σας κάποιο κείμενο που θα με βοηθούσε ή αν μπορώ να ψάξω για κάτι συγκεκριμένο...

Ευχαριστώ.

Δημοσ.

Λοιπόν σχεδίασα μια more like εφαρμογή, δεν μπορώ να υποσχεθώ ότι είναι bug free καθώς είναι η πρώτη φορά που ασχολούμαι με την «περίφημη» more.

 

Το δημοσιεύω προς κάθε ενδιαφερόμενο, μαζί με ορισμένα σχόλια για το πώς θα πρέπει δουλεύει μια more ρουτίνα.

 

>
// Directx's More (Turbo C/C++ 3.0 for DOS)
#include <stdio.h>
#include <conio.h>

int			iReturn=0,iLine=0,iC;
FILE	 		*Stream;
text_info	        TIS;

void main(int argc,char *argv[])
{
 // TODO: Attempt to open first parameter as Stream
 if((Stream=fopen(argv[1],"rb"))!=NULL)
  {
    // HINT: Get screen dimensions (will be used latter on)
    gettextinfo(&TIS);

    while((iC=fgetc(Stream))!=EOF)
     {
       // HINT: Suitiation controlling line warps
       if(iLine>=TIS.screenheight*TIS.screenwidth-1)
	{ getch(); iLine=0; }

       // HINT: Suitiation controlling Return (new lines)
       if(iReturn>=TIS.screenheight)
	{ iReturn=0; iLine=0; getch(); }

       if(iC==0x0D)
	{ iReturn++; }

       iLine++;
       putchar(iC);
     }

    // HINT: Close Stream (release memory)
    fclose(Stream);

    getch();
  }
 else
  {
    printf("file open error - %s\n",argv[1]);
  }
}

---
1ον) Παίρνουμε τις διαστάσεις της τρέχουσας ανάλυσης της οθόνης μας στην δομή TIS ώστε να ξέρουμε 
πόσους χαρακτήρες μπορεί να χωρέσει πριν γεμίσει και χαθεί ο πρώτος χαρακτήρας που θα εκτυπώσουμε.
2ον) Πριν παρουσιάσουμε τον χαρακτήρα μας στην οθόνη (stdout) κάνουμε δυο ελέγχους: Α) Μετράμε αν 
iLine (δηλαδή οι εκτυπωμένοι ως τώρα χαρακτήρες) 
έχει ξεπεράσει το συνολικό μέγεθος χαρακτήρων -1 
(μετράμε από το μηδέν στην C) της οθόνης οπότε διακόπτουμε την έξοδο ή Β) Μετράμε πόσους 
χαρακτήρες αλλαγής γραμμής (iReturn) (13 ή 0x0D) έχουμε λάβει ως τώρα σε σχέση με το ύψος της 
οθόνης οπότε για άλλη μια φορά διακόπτουμε την έξοδο.

Αν σας κάνει εντύπωση ο Α έλεγχος, μην ξεχνάτε ότι αν μια γραμμή είναι μεγαλύτερη από το μήκος της ανάλυσης 
της οθόνης μας το DOS μεταφέρει την συνέχεια της σε νέα γραμμή από μόνο του δίχως να υπάρχει κάποιος 0x0D χαρακτήρας 
στο αρχείο εισόδου (οπότε πρέπει κάπως να υπολογίζουμε και αυτή την περίπτωση). 
Ο κώδικας δοκιμάστηκε σε δυο ειδικά κατασκευασμένα κείμενα που ελέγχουν την λειτουργία του 
Α και Β ελέγχου ενώ ύστερα το δοκίμασα και σε ορισμένα γενικά txt, στα περισσότερα εκτός ορισμένων 
δύσκολων (με binary chars) logs δούλεψε καλά (φυσικά και θα έχει bugs πάντως).

Δείτε το ως μια πρώτη γεύση.

(Ο κώδικας γράφτηκε σε Turbo C 3 για MS-DOS)

Ελπίζω να σας φανεί χρήσιμος,

Καλή τύχη.

Αρχειοθετημένο

Αυτό το θέμα έχει αρχειοθετηθεί και είναι κλειστό για περαιτέρω απαντήσεις.

  • Δημιουργία νέου...