Char Umordnen



  • Hallo C-Freunde

    Ich muss eine Datei auslesen, Umstellen und wieder schreiben.
    Dazu habe ich folgendes Programm geschrieben:

    # include < stdlib.h >
    # include < stdio.h >
    
    void main()
    {
    	int i;
    	int j;
    	int k;
    	char line1[41];
    	char line2[41];
    	char final_line[64];
    	FILE *filePointer_wr;
    	FILE *filePointer_rd;
    	filePointer_wr = fopen("data.vhd", "w");
    	filePointer_rd = fopen("data.hex", "r");
    
    	for (i=1; i<20; i++) {
    
    		fgets(line1, 41,filePointer_rd);		//2 zeilen Lesen
    		fgets(line2, 41,filePointer_rd);
    
    	final_line = line2[37], line2[38], line2[39], line2[40], line2[33], line2[34], line2[35], line2[36], line2[29], line2[30], line2[31], line2[32],
    			line2[25], line2[26], line2[27], line2[28], line2[21], line2[22], line2[23], line2[24], line2[17] line2[18], line2[19], line2[20], line2[13],
    			line2[14], line2[15], line2[16], line2[9], line2[10], line2[11], line2[12], line1[37], line1[38], line1[39], line1[40], line1[33], line1[34],
    			line1[35], line1[36], line1[29], line1[30], line1[31], line1[32], line1[25], line1[26], line1[27], line1[28], line1[21], line1[22], line1[23], 
    			line1[24], line1[17] line1[18], line1[19], line1[20], line1[13], line1[14], line1[15], line1[16], line1[9], line1[10], line1[11], line1[12];
    				//Umstellen
    
    	fprintf(filePointer_wr,final_line);		//Zurückschreiben
    	fclose(filePointer_wr);
    	fclose(filePointer_rd);
    
    }
    

    Nur gibt er mir folgende Fehlermeldungen aus:
    1>c:\users\löggu\documents\visual studio 2008\projects\fripic\fripic\test.c(29) : warning C4047: '=': Anzahl der Dereferenzierungen bei 'char [64]' und 'char' unterschiedlich
    1>c:\users\löggu\documents\visual studio 2008\projects\fripic\fripic\test.c(29) : error C2106: '=': Linker Operand muss ein L-Wert sein
    1>c:\users\löggu\documents\visual studio 2008\projects\fripic\fripic\test.c(30) : error C2146: Syntaxfehler: Fehlendes ';' vor Bezeichner 'line2'
    1>c:\users\löggu\documents\visual studio 2008\projects\fripic\fripic\test.c(33) : error C2146: Syntaxfehler: Fehlendes ';' vor Bezeichner 'line1'

    Kann ich nicht so in ein Char schreiben? Wie muss ich denn das machen?

    Vielen Dank für eure Hilfe
    Gruss Laurent



  • Nee, so geht's nicht. Wenn ich richtig verstehe, was du willst, dann eher so (Zeichen für Zeichen):

    final_line[0] = line2[37];
    //usw...
    

    oder so (mehrere Zeichen auf einmal):

    strncpy(&final_line[0],&line2[37],4);
    


  • Hey, vielen Dank

    Ist ja oberumständlich 😉
    aber mit
    strncpy(&final_line[0],&line2[40],4); funktioniert es nicht, da gibt es mir ein leeres file.

    So:
    final_line[0] = line2[37];
    Funktioniert aber, leider umständlich und nicht so schön 😞

    Weiss jemand gerade was an strncpy falsch ist, falls ich bis dann noch nicht fertig bin mit den einzelnen Chars 🙂

    Gruss Laurent



  • Boriz schrieb:

    aber mit
    strncpy(&final_line[0],&line2[40],4); funktioniert es nicht, da gibt es mir ein leeres file.

    Hatte ich ja auch nicht so geschrieben. Ich habe als zweiten Parameter &line2[37] angegeben (und 4 ist dann die maximale Anzahl an Zeichen, die er kopieren soll, also Index 37-40). Wenn du hier &line2[40] angibst, dürfte er ja maximal 1 Zeichen kopieren, da line2[41] die terminierende Null ist (bzw. sein sollte). Und da hört er spätestens auf.

    Aber wahrscheinlich ist das ganze Rumgehampel Quatsch. Zeig am besten einfach mal exemplarisch, wie die Datei aussieht, und was du daraus machen willst. Da gibt's sicher bessere Lösungen.



  • OK,
    Aussehen tut das File so:

    :020000040000FA
    :10000000926A9368801EEB0E805E802E806C806CFE
    :1000100080CF8AFFFFFFFFFFFFFFFFFFFFFFFFFF14
    :10002000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0
    :10003000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD0

    Und daraus herauskommen sollte sowas:

    FFFFFFFFFFFFFFFFFFFFFFFF8AFF80CF806C806C802E805EEB0E801E9368926A
    FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF

    Also immer die ersten 9 Zeichen und die letzen 2 weg und die erste linie sowieso.
    Dann werden immer die "Nutzdaten" (10te bis 42te Zeichen) von 2 Linien genommen und in 4 Char blöcken in umkehrter Reihenfolge in eine Linie geschrieben.

    Hoffe du verstehst was ich meine.
    Danke und Gruss
    Laurent







  • nochmal sorry, das sind ja keine s-records sondern intel-hex oder so.
    also vergiss die beiden postings davor.
    🙂



  • So, ich hab es hingekriegt.
    Viele Dank Matze

    Für die dies interessiert:

    # include < stdlib.h >
    # include < stdio.h >
    void main()
    {
    	int i;
    	char line1[43];
    	char line2[43];
    	char final_line[64];
    	FILE *filePointer_wr;
    	FILE *filePointer_rd;
    	filePointer_wr = fopen("data.vhd", "w");
    	filePointer_rd = fopen("data.hex", "r");
    	fgets(line1, 16,filePointer_rd);
    
    	for (i=1; i<33; i++) {
    		fgets(line1, 43,filePointer_rd);		
    		fgets(line2, 43,filePointer_rd);		//Read 2 Lines
    		strncpy(&final_line[0],&line2[37],4); 
    		strncpy(&final_line[4],&line2[33],4); 
    		strncpy(&final_line[8],&line2[29],4); 
    		strncpy(&final_line[12],&line2[25],4); 
    		strncpy(&final_line[16],&line2[21],4); 
    		strncpy(&final_line[20],&line2[17],4); 
    		strncpy(&final_line[24],&line2[13],4); 
    		strncpy(&final_line[28],&line2[9],4); 
    		strncpy(&final_line[32],&line1[37],4); 
    		strncpy(&final_line[36],&line1[33],4); 
    		strncpy(&final_line[40],&line1[29],4); 
    		strncpy(&final_line[44],&line1[25],4); 
    		strncpy(&final_line[48],&line1[21],4); 
    		strncpy(&final_line[52],&line1[17],4); 
    		strncpy(&final_line[56],&line1[13],4); 
    		strncpy(&final_line[60],&line1[9],4); 
    		if (i==1 || i==3 || i==5 || i==7 || i==9 || i==11 || i==13 || i==15 || i==17 || i==19 || i==21 || i==23 || i==25 || i==27 || i==29 || i==31) {
    			fprintf(filePointer_wr,"X\"");
    			fprintf(filePointer_wr,final_line);		//Write back first line
    		}
    		else if (i<32){
    		fprintf(filePointer_wr,final_line);		//Write back second line
    		fprintf(filePointer_wr,"\",");
    		fprintf(filePointer_wr,"\n");
    		}
    		else{
    		fprintf(filePointer_wr,final_line);		//Write back last line
    		fprintf(filePointer_wr,"\"");
    		fprintf(filePointer_wr,"\n");
    		}
    	}
    	fclose(filePointer_wr);
    	fclose(filePointer_rd);
    }
    

    Nicht ganz so schön, aber funktionell 😃

    Gruss Laurent



  • Zeile 34 lässt sich einfacher screiben

    if(i % 2)
    


  • So, noch ein bisschen schöner und besser (vorher stimmten die Reihenfolge der 32 char blocks nicht überrein, bis ich das gemerkt habe 🙄 )

    # include < stdlib.h >
    # include < stdio.h >
    void main()
    {
    	int i;
    	char line[45];
    	char final_line[33];
    	char double_line[64];
    	FILE *filePointer_wr;
    	FILE *filePointer_rd;
    	filePointer_wr = fopen("data.vhd", "w");
    	filePointer_rd = fopen("data.hex", "r");
    	fgets(line, 45,filePointer_rd);			//ignore first line
    
    	for (i=1; i<33; i++) {	
    		fgets(line,45 ,filePointer_rd);		//Read Line
    		strncpy(&final_line[0],&line[37],4); 
    		strncpy(&final_line[4],&line[33],4); 
    		strncpy(&final_line[8],&line[29],4); 
    		strncpy(&final_line[12],&line[25],4); 
    		strncpy(&final_line[16],&line[21],4); 
    		strncpy(&final_line[20],&line[17],4); 
    		strncpy(&final_line[24],&line[13],4); 
    		strncpy(&final_line[28],&line[9],4); 
    
    		if (i % 2) {
    			strncpy(&double_line[32],final_line,32);	//Add first Line
    		}
    		else if (i == 32) {
    			strncpy(&double_line[0],final_line,32);		//Add second Line
    			fprintf (filePointer_wr, "X\"%-64.64s\"\n",double_line);	//Last line (without ,)
    		}
    		else {
    
    			strncpy(&double_line[0],final_line,32);		//Add second Line
    			fprintf (filePointer_wr, "X\"%-64.64s\",\n",double_line);	//Write line of 64char (32 bytes)
    		}
    	}
    	fclose(filePointer_wr);
    	fclose(filePointer_rd);
    }
    

Anmelden zum Antworten