Eigenes Dateiformat



  • Ich hab mir für meine Bilddaten ein eigenes Dateiformat ausgedacht. Da wird jeder Punkt einzeln mit seinen Koordinaten und Farbe gespeichert, und zwar in folgender Form:
    x,y,color
    ...
    ...

    Wie lese ich jetzt z.B. die x Koordinate wieder ein? Einfach eine Schleife mit fgetc und dann immer bis zum Komma, oder wie? Und wie bekomme ich dann aus diesem Array wieder die Richtige x Koordinatea als Zahl?



  • Wenn Du die Daten in eine Struktur schreibst, kannst du sie in binärer Form bequem ein-und Auslesen.



  • Hier einmal ein beispiel:

    #include <stdio.h>
    #include <string.h>
    
    int main(int argc, char *argv[])
    {
    	int i=0,j=0,k=0;
    	char buffer[3][12];
    
    	for(j=0;j<=strlen(argv[1]);j++)
    	{
    		if(argv[1][j]==',')
    		{
    			buffer[i][k]='\0';
    			k=0;
    			i++;
    		}
    		else
    		{
    			buffer[i][k]=argv[1][j];
    			k++;
    		}
    	}
    	for(i=0;i<3;i++) printf("Buffer: %s\n",buffer[i]);
    	return(0);
    }
    

    Bei uebergabe des Parameters hello,world,bla gibt die funktion folgendes aus:

    devilx@xeno:~/Desktop$ ./read hello,world,bla
    Buffer: hello
    Buffer: world
    Buffer: bla
    devilx@xeno:~/Desktop$
    

    Bye



  • Ach ja, die umwandlung des Strings in einen Int geschieht durch atoi();. Siehe manual.



  • Und ier mal ein Beispiel zu meinem Vorschlag:

    struct _punkt
    {
    int x;
    int y;
    int color;
    };
    typedef _punkt Punkt;
    
    int main(int argc, char* argv[])
    {
    	Punkt schreibePunkt={5,5,20};
    	Punkt lesePunkt={0};
    
    	int file=0;
    
    	file = _open ("d:\\test.dat",_O_RDWR|_O_CREAT,0750);
    
    	_write(file,&schreibePunkt,sizeof(schreibePunkt));
    
    	_lseek(file,0,SEEK_SET);
    
    	_read(file,&lesePunkt,sizeof(lesePunkt));
    
    	_close(file);
    
    	return 0;
    }
    

    Das ist jetzt zum Auslesen eines Punktes. Wenn du mehrere Punkte hintereinander schreiben willst, musst du vorher die anzahl der vorhandenen Einträge bestimmen. Die Größe der Datei bestimmst du mit lseek und da du weist, wie groß deine Strukturen sind, kannst du die Anzahl der Einträge bestimmen. So oft liest du dann aus der Datei diese Struktur aus.



  • Erstmal danke für die Antworten!
    Habe nun aber folgendes Problem: Ich habe eine Structur

    struct POINT
    {
         int x;
         int y;
         int color;
    }points[1024][768];
    

    Bei dieser Größe von points bringt er mir aber irgendeinen komischen Fehler von wegen mit Stack oder so.n Kann das sein dass er diese Größe nicht verwalten kann?



  • Wenn du das so machst, wie das da steht, kannst du dir die Koordinatenangabe in der Struktur aber sparen! Da würde doch nichts anderes drin stehen, als in der Feldposition!



  • Den Stack Overflow vermeidest Du, indem Du das ganze auf den Heap packst.
    Wenn Du es unbedingt so machen willst,versuch mal was in der Richtung:

    Punkt **schreibePunkt=(Punkt**)malloc(sizeof(Punkt*)*1024);
    
    	for(int i=0;i<768;i++)
    	{
    		schreibePunkt[i]=(Punkt*)malloc(sizeof(Punkt));
    		memset(schreibePunkt[i],0,sizeof(Punkt));
    
    	}
    

    Die Koordinate kannst du dann mit Punkt[x][y] ansprechen.
    Aber vergiss nicht, hinterher den Speicher wieder freizugeben!



  • Einmal malloc für die gesamten Bilddaten reicht vollkommen aus. Zudem kann ich derBob nur zustimmen, x und y sind redundant.


Anmelden zum Antworten