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% zu 🙂

    ich 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 , 4

    daher 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;
    

Anmelden zum Antworten