Einen Teiltext in eine andere Datei schreiben
-
Hi ich hab den Code jetzt n bissl verändert und hätt gern, dass er die ersten 6 Buchstaben nach m Doppelpunkt einliest:
int L01_RedFil(char* FilNam) { char s1[100]; FILE *d1 = fopen(FilNam, "r"); FILE *d2 = fopen("output.txt", "w"); while (Etc_RedStr(d1,s1,':',6)) { fprintf(d2,"%s\n",s1); } fclose(d1); fclose(d2); return (0); } //------------------------------------------------------------------------------ //------------------------------------------------------------------------------ int Etc_RedStr(FILE* d,char* s,char dp,int nMax) { int i,nc=0; while((i=fgetc(d))!=dp) {if(i==EOF) return(-1);} while((i=fgetc(d))==dp) { if(i==EOF) return(-1); s[nc+6] = i; } s[nc]='\0'; return(nc); }
-
Bitte, lies dir nochmal meine letzten Beiträge durch. Sicherheitshalber ein letztes Mal die Erklärung:
Du übergibst der Funktion die maximale Zeichenanzahl, die sie lesen soll (das ist schonmal positiv), aber in der Funktion fängst du nirgends ab, ob diese Limit überschritten wurde (und das ist schlecht, weil der Funktion jetzt egal ist, was du für eine Größe übergeben hast). Wenn du schon nicht kapierst, wieso das wichtig ist, dann solltest du wenigstens die Beispielfunktionen verwenden, die ich dir gebe.
PS: Solange du nicht zeigst, daß du über diesen Beitrag zumindest nachgedacht hast, kommt von mir keine Hilfe.
-
Nur falls es dich interessiert:
int Etc_RedStr(FILE* d,char* s,char dp,int nMax) { int z; while((z=fgetc(d))!=dp) { if(z==EOF) return(0); } for(z=0;z<nMax;z++) { int c = fgetc(d); s[z] = c; if(c==EOF) return(0); } return 1; }
-
Na das sieht doch schon recht brauchbar aus - jetzt fehlt nur noch der Null-Terminator für den String, dann kannst du damit auch weiterarbeiten.
-
Das sieht jetzt ungefähr so aus in der txt die ich einlese:
:DocNam {_Doc_01.rtf}
:CADNam {NoDef}
:CusNam {}
:ClcRem {}
:PysTyp {GerRat}Jetzt will ich, dass er die Klammer auch noch einliest und ausgiebt. Hab ich so gemacht:
int L01_RedFil(char* FilNam) { char s1[100]; int l1=0; FILE *d1 = fopen(FilNam, "r"); FILE *d2 = fopen("output.txt", "w"); while (Etc_RedStr(d1,s1,':',6)) { fprintf(d2,"%s",s1); l1 = Etc_RedStr(d1,s1,'{','}',50); fprintf(d2," {%s}\n",s1,l1); } fclose(d1); fclose(d2); return (0); } //------------------------------------------------------------------------------ //------------------------------------------------------------------------------ int Etc_RedStr(FILE* d,char* s,char dp,int nMax) { int i; int z; while((i=fgetc(d))!=dp) { if(i==EOF) return(0); } for(z=0;z<nMax;z++) { int c = fgetc(d); s[z] = c; if(c==EOF) return(0); } return 1; } //------------------------------------------------------------------------------ //------------------------------------------------------------------------------ int Etc_RedStr(FILE* d,char* s,char ka,char kz,int nMax) { int c,nc=0; while((c=fgetc(d))!=ka) {if(c==EOF) return(-1);} while((c=fgetc(d))!=kz) { if(c==EOF) return(-1); s[nc] = c; nc = nc + 1; } s[nc] = '\0'; return (nc); }Allerdings liest der n bissl falsch weil was rauskommt is das:
DocNam’| {_Doc_01.rtf}
CADNam1.rtf {NoDef}
CusNam1.rtf {}
ClcRem1.rtf {}
PysTyp1.rtf {GerRat}Die txt is noch viel länger aber nur bei 2.-4. steht dieses "1.rtf" davor
-
Hat sich erledigt. Musste nur nen 2. char definieren. Und das l1 stand einmal zu viel drinnen.
-
Guten Morgen,
wie mach ich denn das am dümmsten, wenn ich was einlesen will, er aber erst in der 3. Zeile anfangen soll.
while (Etc_RedStr(d1,s1,':',6)) { fprintf(d2,"%s",s1); }So aber wie lass ich die 1. 3 Zeilen aus?
-
Du könntest vor dieser Schleife solange Zeichen einlesen, bis du das dritte '\n' erreicht hast. (wenn du mit fstreams arbeiten würdest, könntest du auch dreimal ignore() aufrufen, um die ersten Zeilen zu überlesen)
-
Is da n Fehler drin?
weil die Datei soll er so einlesen:
einlesen.txt schrieb:
:DocNam {_Doc_01.rtf}
:CADNam {NoDef}
:CusNam {}
:ClcRem {}
:PysTyp {GerRat} 7.000000000000000E+00 {1}
:PysTyp {GerMtm} 2.810000000000000E-04 {kgcm^2}und das kommt raus:
output.txt schrieb:
DocNam {_Doc_01.rtf}0.000000 {NoDef}
CusNam {}0.000000 {}
PysTyp {GerRat}7.000000 {1}
PysTyp {GerMtm}0.000281 {kgcm^2}hier der zugehörige code:
int L01_RedFil(char* FilNam) { char s1[100]; char s2[100]; char s3[100]; char s4[100]; int l1,l3,l2; double Wert; FILE *d1 = fopen(FilNam, "r"); FILE *d2 = fopen("output.txt", "w"); while (Etc_RedStr(d1,s1,':',6)) { fprintf(d2,"%s",s1); l1 = Etc_RedStr(d1,s2,'{','}',50); fprintf(d2," {%s}",s2); fscanf(d1,"%lf",&Wert); fprintf(d2,"%lf",Wert); l3 = Etc_RedStr(d1,s4,'{','}',10); fprintf(d2," {%s}\n",s4); }fclose(d1);
fclose(d2);return (0);
}
-
bitte schließen
bye