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önWeiss 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
:10003000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD0Und daraus herauskommen sollte sowas:
FFFFFFFFFFFFFFFFFFFFFFFF8AFF80CF806C806C802E805EEB0E801E9368926A
FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFAlso 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
-
schau mal hier: http://www.davehylands.com/Software/SRec/
-
^^sorry, das ist cpp, also dann das: https://svn.jerryweb.org/wsvn/public/flash-tools/trunk/src/p2k/srecord.c?view=markup
-
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 MatzeFü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); }