Text to BMP



  • Hallo liebe Leute! Ich bin neu in eurem Forum, hätte aber auch gleich ein kleines (für mich großes) problem/Anliegen...
    Hab vor etwas mehr als einem Monat das erste mal in meinem Leben mit einer Programmiersprache (C) zu tun gehabt und nun sollen wir im Rahmen eines Kurses ein Programm schreiben, dass per Kommandozeilenaufruf eine Text Datei mit gewissen Bildgebenden Informationen (in jeder zeile steht der Typ [4Eck,3Eck oder Kreis], die ID, die Farbe etc...)in ein bitmap file schreibt.
    Konkret möchte ich nun wie folgt vorgehen:
    struct anlegen mit den Variablentypen die in der Textdatei stehen.
    über argv und fscanf die Werte in die Main funktion einlesen und in die Variablen des structs speichern. Habe dabei allerdings ein paar Probleme:
    1. wie kann ich mit der Funktion fscanf Zeile für Zeile auslesen und jeweils als neue Variablensammlung in eine Liste speichern?
    2. brauch ich verschiedene structs wenn es in der input.txt datei 3 verschiedene typen gibt (Dreieck,Rechteck,Kreis)?

    Bin für jede Hilfe sehr dankbar...Für mich als Anfänger ist die Aufgabe sehr schwierig. Vielen Dank im Voraus und einen schönen Abend,
    Ricky



  • hi
    nö, im grunde brauchst du keine struct, es sei denn die aufgabe erfordert es.
    textdateien kannst du mit fgets einlesen.
    wenn die maximale zeilenlänge bekannt ist, genügt ein einfaches char array, das du
    an fgets übergibst.



  • Für fscanf sind Zeilen kein Problem.
    Evtl solltest du aber die Zeilen per fgets lesen und mit sscanf auswerten.
    Dann kannst du sicher gehen, das du auch eine Zeile gelesen hast.

    Eine Liste musst du selber verwalten.
    Für den Anfang geht aber wohl auch ein Array von deiner struct. Mach es halt ausreichend groß.

    Du kannst alles in einer struct verwalten.
    Du musst dir halt überlegen, was für Angaben du für die Objekte brauchst.

    Dreick ist klar, das sind drei Punkte (jeder mit x und y Koordinate)
    Sind die Vierecke orthogonal zu dem Koordinatensystem oder allgemein?
    Dann bruchst du vier Punkte oder nur zwei gegenüberliegende Punkte.

    Beim Kreis kannst du einen Mittelpunkt nehmen und den Radius oder auch drei Punkte.

    Sonst gibt es ja auch noch die union .



  • vermutlich wird deine textdatei so in etwa aussehen
    4Eck;id=2;Farbe=rot
    3Eck;id=1;Farbe=gruen
    vllt solltest du mal das format posten



  • Vielen Dank für eure Antworten!
    Ja das ganze soll laut Angabe mit listen und structs passieren.
    Mein Denk problem ist momentan wie ich z.B. das Rechteck und den Kreis mit unterscheidlichen parametern(variablen) in eine liste bekomme.

    so in etwa kann die input txt datei aussehen.

    Rechteck id="1" farbe="000033" x="0" y="0" breite="640" höhe="480"
    Kreis id="2" color="ffff00" x="300" y="240" radius="180"
    Dreieck id="3" color="000033" ax="320" ay="240" bx="500" by="300" cx="500" cy="180"

    Liebe Grüße
    Ricky



  • ricky03 schrieb:

    wie ich z.B. das Rechteck und den Kreis mit unterscheidlichen parametern(variablen) in eine liste bekomme

    Gar nicht, wenn du mit liste ein Array meinst. Denn bei Arrays haben alle Elemente den gleichen Typ, d.h. entweder du definierst dir einen struct-Typ der alle möglichen Parameter aufnehmen kann (halte ich für ziemlich sinnfrei und für Anfänger als Lernzweck ungeeignet) oder du definierst dir ein struct-Array für jeden vorkommenden Typ.



  • ricky03 schrieb:

    Kreis id="2" color="ffff00" x="300" y="240" radius="180"

    kann sich das format bzw die reihenfolge auch ändern? z.b.
    y="240" radius="180" Kreis id="2" color="ffff00" x="300"
    x="300" y="240" radius="180" color="ffff00" Kreis id="2"
    usw?



  • Nein, das Format ist fix in dieser Reihenfolge Zeile für Zeile vogegeben.



  • der grobe ablauf könnte so aussehen:
    3 formatstrings für fscanf vorbereiten, einen fürs dreieck, einen fürs viereck und einen für den kreis.
    jeweils das erste wort einer zeile einlesen.
    wenn es ein dreieck, ein rechteck oder ein kreis ist, speicherplatz für die entsprechende struktur mit malloc reservieren und die zugehörigen daten per fscanf mit dem zugehörigen formatstring in die struktur einlesen.
    struktur an liste anhängen, nächste zeile ... bis datei-ende.



  • typedef enum tElementType { t_rechteck, t_dreieck, t_kreis } element_type;
    
    typedef struct tagRechteck
    {
    	int x, y, breite, hoehe;
    } rechteck_t;
    
    typedef struct tagDreieck
    {
    	int ax, ay, bx, by, cx, cy;
    } dreieck_t;
    
    typedef struct tagKreis
    {
    	int x, y, r;
    } kreis_t;
    
    typedef union tagListElement
    {
    	rechteck_t rechteck;
    	dreieck_t dreieck;
    	kreis_t kreis;
    } list_elment_t;
    
    typedef struct tagElementList
    {
    	element_type type;
    	list_elment_t element;
    	list_elment_t* next;
    } element_list;
    


  • formatstrings sind ne ganz schön fummelige angelegeheit! 😃

    #include <stdio.h>
    #include <string.h>
    
    typedef struct tagRechteck
    {
    	int x, y, breite, hoehe, farbe, id;
    } rechteck_t;
    
    void zeig_daten_rechteck( rechteck_t* p )
    {
    	printf("id=%d farbe=%x x=%d y=%d breite=%d hoehe=%d\n", p->id, p->farbe, p->x, p->y, p->breite, p->hoehe);
    }
    
    int main(void)
    {
    	rechteck_t rechteck={0}; // alle member mit 0 initialisieren
    	char* str_rechteck = "Rechteck id=\"1\" farbe=\"333300\" x=\"33\" y=\"44\" breite=\"640\" höhe=\"480\"";
    	sscanf ( str_rechteck, "%*[^=]%*[^0-9]%d %*[^=]%*[^a-f0-9] %x %*[^=]%*[^0-9] %d %*[^=]%*[^0-9] %d %*[^=]%*[^0-9] %d %*[^=]%*[^0-9] %d", 
    				&rechteck.id,  &rechteck.farbe, &rechteck.x, &rechteck.y, &rechteck.breite, &rechteck.hoehe );
    	zeig_daten_rechteck(&rechteck);
    	return 0;
    }
    

    der einfachheit wegen wird hier aus nem string extrahiert.
    entsprechend kannst du dir die anderen formatstrings für fscanf zurechtfummeln.


Anmelden zum Antworten