Filestuff
-
Mein Program soll letztendlich ein alte Datei für Excel lesbar machen. Die Blöcke sind immer abwechselnd 991 und 1059 Zeichen lang. Darin sind jeweils 81 Datensätze an Informationen enthalten, deren Position und Länge in tab[][] enthalten sind. Das Problem ist nun, das ab dem dritten Datensatz das Programm mist baut und ich absolut nicht weiß, warum.
Ohne "memset(buffer, 'x', 1060);" sehen die ersten 3 Zeilen von out.txt so aus:0NYN469;1997;VF1B56LKC16080851;B56L;;Renault B56L /L;003;...
A-S 7782;1999;VF1FDAED518375602;FD0A;;Renault Master;003;...
A-VJ 511;1999;VF1FDAED518375602;FD0A;;Renault Master;003;...Mit so:
0NYN469;1997;VF1B56LKC16080851;B56L;;Renault B56L /L;003;...
A-S 7782;1999;VF1FDAED518375602;FD0A;;Renault Master;003;...
A-VJ 511;xxxx;xxxxxxxxxxxxxxxxxxxx;xxxx;xx;xxxxxxxxxxxxxxxxxxxx;xxx;...Hier der Code:
FILE *in(NULL), *out(NULL); char *test(NULL); bool sw(true); int cnt(0); in = fopen("in.d0a", "r"); assert(in != NULL && "Could not open file"); out = fopen("out.txt", "w"); assert(out != NULL && "Could not create file"); char buffer[1060], *tmp(NULL); fseek(in, 2058, SEEK_SET); while(!feof(in)) { memset(buffer, 'x', 1060); test = sw ? fgets(buffer, 991, in) : fgets(buffer, 1059, in); sw = sw ? false : true; assert(test != NULL); for(int i = 0; i < 81; ++i) { tmp = new char[tab[i][1]+1]; strncpy(tmp, &buffer[tab[i][0]], tab[i][1]); if(tmp[0] == ' ') { fputc(';', out); delete []tmp; continue; } for(int j = 0; j < tab[i][1]-1; ++j) if(tmp[j] == ' ' && tmp[j+1] == ' ') { tmp[j] = '\0'; break; }; tmp[tab[i][1]] = '\0';//*/ fputs(tmp, out); fputc(';', out); fflush(out); delete []tmp; }; fputs(buffer, out); fputc('\n', out); ++cnt; }; fclose(in); fclose(out); int num_closed(_fcloseall()); assert(num_closed < 1);
Außerdem sind die Outputfiles immer nur 4kB groß (also 4.096Bytes). Das muss auch irgendein Logikfehler sein - letztendlich müste die File mehrere MB umfassen.
-
Das kapiert ja kein Schwein. könntest du mal kommentare dazuschreiben? außerdem warum benutzt du immer memset? = tuts doch auch und is nich sone potentielle fehlerquelle
-
mwoidt schrieb:
...
außerdem warum benutzt du immer memset? = tuts doch auch und is nich sone potentielle
fehlerquelleNoe, '=' tut nich das selbe
Ansonsten geb ich dir Recht, Kommentare waeren sehr hilfreich
mfg
v R
-
Es hat sich mittlerweile heraus gestellt, das diverse eingelesene Chars als Steuerzeichen interpretiert wurden und das die Fehler verursacht hat - der Code ist also ok.
Mittlweile hab ich aber ein anderes Problem: Die Umlaute werden falsch convertiert. Aus Schulzeiten weiß ich noch, das es mehrere ASCII-Tabelen(mindestens 2) die Amerikanische und die (?) Deutsche.
Die beiden unterscheiden sich natürlich und aller wahrscheinlichkeit nach auch bei den Umlauten.
Weiß vielleicht jemand, wie ich das lösen könnte, ohne die Umlaute von Hand zu konvertieren also jedesmal, das eingelesene nach bestimmten char-codes zudurchforsten)?Danke für Eure Hilfsbereitschaft.
-
Weiß niemand eine Antwort?
-
dir bleibt wohl nichts anderes über, als den Zeichensatz auf den vom System verwendeten Zeichensatz zu konvertieren.
btw. wenn du eh C Programmierst, warum fragst du dann im C++ Forum nach?
und assert solltest du nutzen, um auf Fehler zu testen, die im normalen Betrieb nicht mehr vorkommen sollten. Das fopen fehlschlägt, kann aber auch im normalen Betrieb passieren!
-
Hab ich auch gemacht, ich fand das nur sehr unsauber, die einfach auszutauschen...
Danke.