Problem fgets() für nächste Zeile
-
also ich hab die schleifen jetzt mal modifiziert, dann bleibt er auch in der while hängen.
aber dafür habe ich die lösung mit fseek() hinbekommen.
aber: rein logisch muss ich den zeiger ja dann 2 zeilen hochsetzen.
und 2 zeilen lässt er sich nicht zurücksetzen. dann bleibt er auch in der while hängen.while(!feof(fcache)) { if(mode == 0) fgets(inpline,MAXLENGTH,fcache); if(mode == 1 && strncmp(inpline,"odd <01",18)==0) { fprintf(fmake_list,"odd <"); for(i=17;i<41;++i) fprintf(fmake_list,"%c",inpline[i]); fgets(dqs_line, MAXLENGTH, fcache); fgets(dq_line, MAXLENGTH, fcache); if(strncmp(dqs_line,inpline,40)==0 && strncmp(dq_line,"even",4)!=0) { for(i=41;i<45;++i) fprintf(fmake_list,"%c",dqs_line[i]); if(strncmp(dqs_line,dq_line,44)==0) { for(i=45;inpline[i]!='\n';++i) fprintf(fmake_list,"%c",dq_line[i]); strcpy(inpline,dq_line); } else { for(i=45;inpline[i]!='\n';++i) fprintf(fmake_list,"%c",dqs_line[i]); strcpy(inpline,dqs_line); } fprintf(fmake_list,"\n"); } else { for(i=41;i<45;++i) fprintf(fmake_list,"%c",inpline[i]); for(i=45;inpline[i]!='\n';++i) fprintf(fmake_list,"%c",inpline[i]); fprintf(fmake_list,"\n"); mode = 0; }
-
Also inzwischen blicke ich auch nicht mehr durch, was du da eigentlich machst - das ist wohl der ideale Zeitpunkt, dein gesamtes System zu überdenken (notfalls beginnend mit dem Eingabeformat - wozu sind überhaupt drei Eingabezeilen nötig, die du dann doch nach solch komplizierten Regeln zu einer zusammenpuzzlen mußt?).
-
naja, also was ich versucht habe:
wenn nur die inpline gebraucht wird, nix kopieren und er soll einfach die nächste zeile als inpline einlesen.
wenn die dqs_line mit eingelesen wird aber nicht gepasst hat soll er die dqs_line in die inpline kopieren.
wenn die dq_line eingelesen wurde allerdings nicht passt aber die dqs_line gepasst hat: dq_line -> inpline.also der sinn:
das sind bitmuster und schreibvorgänge sind in dem vorherigen format immer 2x der gleiche "vektor", die eben alle 2 informationen dazu beitragen.
Die lesevorgänge haben 3 vektoren und setzen ihre infos aus den 3 vektoren zusammen.
(even = logische 1 , odd = logische 0) und das wird dann eben am ende immer abwechselnd, dass man ein schönes signal hat.wieso 2-3 zeilen einlesen:
eingangs datei ist so aufgebaut:
odd Write 1 + 1 oder 2 even (variiert) -> EVEN
even Write 2
even Write 3
even + nächster odd -> ODD
odd
odd + nächster even -> EVEN
even
...
-
Args, das sieht ganz danach aus, als ob meine Signatur besser auf dich passen würde
(was programmierst du eigentlich? Und was für einen Sinn soll so ein Eingabeformat haben?)
-
ja das stimmt.
deine signatur trifft auf mich 110% zuich programmiere einen "converter" der einfach das eine "format" in ein anderes umwandeln soll.
das eingangsformat kann man sich so vorstellen:
man hat ein messgerät, welches in bestimmten zeitabständen die signale misst.
jetzt kann es z.b. sein, man hat 5 sekunden logische 1 (even) und misst das signal alle 2 sekunden.
also bekommt man messdaten bei
zeit = 0 , 2 , 4
oder zeit = 1 , 3 , 5
oder zeit = 2 , 4daher kann es eben vorkommen dass so eine logische "1" 3x drinsteht und manchmal eben nur 2x.
-
Ich hab es nochmal komplett neu versucht nur mit 2 zeilen.
Problem: er liest immer die gleiche zeile ein und geht nicht zur nächsten!while(!feof(fcache)) { if(mode == 0 || strcmp(dqs_line,"")==0) // Lese Zeile 1+2 fgets(inpline,MAXLENGTH,fcache); if(mode == 1 && strncmp(inpline,"odd <01",18)==0) { fprintf(fmake_list,"odd <"); for(i=17;i<41;++i) fprintf(fmake_list,"%c",inpline[i]); fgets(dqs_line,MAXLENGTH,fcache); if(strncmp(inpline,dqs_line,41)==0) { for(i=41;i<45;++i) fprintf(fmake_list,"%c",dqs_line[i]); strcpy(dqs_line,""); } else { for(i=41;i<45;++i) fprintf(fmake_list,"%c",inpline[i]); strcpy(inpline,dqs_line); } fprintf(fmake_list,"\n"); } if(strncmp(inpline,"even WS_NN <10",18)==0) mode = 1; else if(strncmp(inpline,"odd <01",18)==0) mode = 2;