Forum: Mikrocontroller und Digitale Elektronik printf in Textdatei ausgeben


von J. T. (chaoskind)


Lesenswert?

MoinMoin,

ich bin grad dabei, nen PID-Regler zu basteln. Da ich in C noch ziemlich 
unerfahren bin, habe ich erstmal nur ne Konsolenanwendung geschrieben, 
in der der Regler implementiert ist. Das ganze auf den µC umzusetzen ist 
der nächste Schritt.

Nun möchte ich um den Regler zu testen, die Werte die er mir mit printf 
ausgibt, in einer Textdatei loggen, und habe dazu folgendes entdeckt.
1
/* printf2.c */
2
#include <stdio.h>
3
4
int main(void) {
5
   printf("Diese Ausgabe soll in einer Textdatei stehen\n");
6
   return 0;
7
}

Übersetzen Sie dieses Programm wie gewohnt, und starten Sie es, indem 
Sie in einer Konsole Folgendes eingeben (als Programmname sei hier out 
gegeben):
1
$ out > test.txt

Aber egal wo ich das eingebe, es kommt einfach keine Textdatei zustande. 
Ich hab versucht das in der Console (das ist doch das kleine schwarze 
DOS-Fenster, das aufgeht, wenn ich die compilierte .exe starte?) 
einzugeben, klappt nicht.

Ich habe in Code:Blocks versucht, das als Compileroption einzugeben, 
klappt nicht...

Kann mir einer von euch sagen, wie ich die Ausgabe als Textdatei 
bekomme?

MfG Chaos

P.S. hier noch der Code vom Regler, falls es intressiert.
1
#include <stdio.h>
2
3
float Messwert = 10000;
4
float Sollwert = 10000;
5
int Zaehler = 0;
6
7
float Reglerwert;
8
float P = 0;
9
float I = 0;
10
float D = 0;
11
float Kp = 0.50;
12
float Ki = 0.00;
13
float Kd = 0.01;
14
float P_alt = 0;
15
float I_alt = 0;
16
float Messwert_alt;
17
18
int main(void)
19
{    
20
    int Modulo = 0;
21
    while(Zaehler < 1000)
22
    {
23
        P = (Sollwert - Messwert);
24
        printf("P-Anteil = Sollwert - Istwert\n---> %f-%f=%f\n \n",Sollwert,Messwert,P);
25
        I = I_alt + P;
26
        printf("I-Anteil = P + alter I-Anteil\n---> %f+%f=%f\n \n",P,I_alt,I);
27
        D = P - P_alt;
28
        printf("D-Anteil = P - vorherigem P\n---> %f-%f=%f\n \n",P,P_alt,D);
29
30
        I_alt = I;
31
        P_alt = P;
32
        Messwert_alt = Messwert;
33
34
        Reglerwert = P*Kp + I*Ki + D*Kd;
35
        printf("Reglerwert = P*Kp + I*Ki + D*Kd\n---> %f*%f + %f*%f + %f*%f=%f\n \n",P,Kp,I,Ki,D,Kd,Reglerwert);
36
37
        Messwert = Messwert+Reglerwert;
38
        printf("Istwert = alter Istwert+Reglerwert\n---> %f+%f=%f\n \n \n \n \n \n",Messwert_alt,Reglerwert,Messwert);
39
40
      //  printf("Soll: %f       Ist: %f \n \nP: %f \nI: %f \nD: %f \n \nDaraus ergibt sich ein Reglerwert von %f\n \n \n \n \n",Sollwert,Messwert,P,I,D,Reglerwert);
41
        //printf(" Ist: %f",Messwert);
42
43
44
        Modulo = (Modulo+1) % 10;
45
        if(Modulo == 0)
46
        {
47
            int messwert;
48
            int sollwert;
49
            Zaehler ++;
50
            printf("Fuer Simulation einer Stoerung bitte neuen Istwert eingeben\n");
51
            scanf("%d", &messwert);
52
            fflush(stdin);
53
            printf("\n\n");
54
            printf("Bitte Sollwert eingeben, fuer keine Aenderung einfach den alten Wert eingeben\n");
55
            scanf("%d", &sollwert);
56
            fflush(stdin);
57
            printf("\n\n");
58
            printf("\n \n \n \n \n");
59
            fflush(stdin);
60
            Messwert = messwert;
61
            Sollwert = sollwert;
62
        }
63
64
    }
65
    return 0;
66
}

von Markus M. (mark_m)


Lesenswert?

Ob die Umleitung der Standardausgabe in eine Datei auch unter Windows so 
funktioniert kann ich nicht sagen. Für Unix/Linux ist das normal.

Du könntest aber auch "printf" durch "fprintf" ersetzen.

http://en.cppreference.com/w/c/io/fprintf

Grüsse

Nachtrag: Hab da etwas gefunden!

https://www.youtube.com/watch?v=dQst_7g8BNA

von troll (Gast)


Lesenswert?

Markus M. schrieb:
> Ob die Umleitung der Standardausgabe in eine Datei auch unter Windows so
> funktioniert kann ich nicht sagen.
Sollte klappen... Ich weiß allerdings nicht was passiert wenn man 
zwischendurch von stdin liest.

von Udo S. (urschmitt)


Lesenswert?

Markus M. schrieb:
> Du könntest aber auch "printf" durch "fprintf" ersetzen.
Eben
Sorry aber File I/O sind die absoluten Basics.
Du brauchst ein C Buch und musst es auch durcharbeiten!

von J. T. (chaoskind)


Lesenswert?

Danke für euer Antworten, das werd ich gleich mal versuchen.

@Udo Schmitt: Das Beispiel stammt aus meinem "C-Buch" C von A bis Z, das 
gabs zum kostenlosen Download...

von Oliver (Gast)


Lesenswert?

j. t. schrieb:
> Ich hab versucht das in der Console (das ist doch das kleine schwarze
> DOS-Fenster, das aufgeht, wenn ich die compilierte .exe starte?)
> einzugeben, klappt nicht.

Hm. Wenn du das Programm aus dem Explorer startest, geht zwar ein 
kleines schwarzes "Dos"-Fenster auf, aber das ist schneller wieder zum, 
als du gucken kannst.

Starte cmd.exe, dann bekommst du ein dauerhaftes Konsolenfenster.

j. t. schrieb:
> $ out > test.txt

Wo kommt denn das Zeichen '$' her?
Ein einfaches

out > test.txt

macht das, was du willst, zumindest unter Dos und Windows 3.1 bis 7. Ob 
das unter Windows 8 noch geht, weiß ich allerdings nicht.

Oliver

von Udo S. (urschmitt)


Lesenswert?

j. t. schrieb:
> @Udo Schmitt: Das Beispiel stammt aus meinem "C-Buch" C von A bis Z, das
> gabs zum kostenlosen Download...

Mit einem Buch meine ich so ein altmodisches Ding mit Seiten aus totem 
Holz, das man auch ohne Ipad, Computer oder handy "abspielen" kann.

j. t. schrieb:
> Nun möchte ich um den Regler zu testen, die Werte die er mir mit printf
> ausgibt, in einer Textdatei loggen, und habe dazu folgendes entdeckt.
> /* printf2.c */
> #include <stdio.h>
>
> int main(void) {
>    printf("Diese Ausgabe soll in einer Textdatei stehen\n");
>    return 0;
> }

Und wenn ich das hier lese, vor allem die Vokabel "entdeckt" dann hast 
du auch in deinem Onlinebuch keine 5 Seiten am Stück durchgelesen um zu 
verstehen wie die Grundlagen von C funktionieren.
Um Karl Heinz Buchegger nochmal zu zitieren:
"Du brauchst ein gutes C Buch und musst es auch durcharbeiten"
!!!
Viel Erfolg

von J. T. (chaoskind)


Lesenswert?

Doch doch, stell dir vor, grad wenn man Sachen am Stück liest "entdeckt" 
man viele nützliche Dinge... naja manchmal auch nicht so nützlich..

Aber vermutlich gehört dieses "Buch" dann nicht zu den Guten...

Und nachdem ich mehrere Seiten am Stück las, konnte ich immerhin dieses 
kleine Progrämmchen zum laufen bringen, was nach durcharbeiten einiger 
kleiner Tutorials auch nicht so richtig funktioniert hatte. Aber so 
langsam verstehe ich tatsächlich die ersten Schritte von C.


int fprintf( FILE          *stream, const char          *format, ... );

Was bedeutet hier das *stream und das *format? Ich hab versucht, das so:
1
fprintf(test.txt "Reglerwert = P*Kp + I*Ki + D*Kd\n---> %f*%f + %f*%f + %f*%f=%f\n \n",P,Kp,I,Ki,D,Kd,Reglerwert);
 umzusetzen.
Da hat er jedoch drei Fehler ausgegeben.
"test.txt file or directory does not exist"
"& file or directory does not exist"
"ReglerOhne_µC file or directory does not exist"

test.txt war mir ja noch klar da hab ich die test.txt im Verzeichnis 
erstellt, und schon warens nur noch 2 Fehler, ich hab testhalber auch 
noch die anderen beiden als .txt erstellt, jedoch ohne Erfolg.

Nun werd ich erstmal die cmd.exe-Geschichte probieren, die Oliver 
vorgeschlagen hat. Das & vor dem out stammt übrigens aus dem C von A bis 
Z "Buch"

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


Lesenswert?

j. t. schrieb:
> Was bedeutet hier das *stream und das *format?

Lies ein C-Buch!

von J. T. (chaoskind)


Lesenswert?

Nun verstehe ich garnichts mehr... Ich hab die Zeile
1
fprintf(test.txt "Reglerwert = P*Kp + I*Ki + D*Kd\n---> %f*%f + %f*%f + %f*%f=%f\n \n",P,Kp,I,Ki,D,Kd,Reglerwert);
nun wieder zu
1
printf("Reglerwert = P*Kp + I*Ki + D*Kd\n---> %f*%f + %f*%f + %f*%f=%f\n \n",P,Kp,I,Ki,D,Kd,Reglerwert);
geändert, aber er gibt mir immer noch die Fehlermeldung aus, das er die 
test.txt usw nicht finden kann....
Hier nochmal der ganze Code nach dem zurückändern, evtl kann ja nochmal 
wer drüberfliegen, ob ich nur was überseh.
1
#include <stdio.h>
2
3
float Messwert = 10000;
4
float Sollwert = 10000;
5
int Zaehler = 0;
6
7
float Reglerwert;
8
float P = 0;
9
float I = 0;
10
float D = 0;
11
float Kp = 0.50;
12
float Ki = 0.00;
13
float Kd = 0.01;
14
float P_alt = 0;
15
float I_alt = 0;
16
float Messwert_alt;
17
18
int main(void)
19
{
20
    int Modulo = 0;
21
    while(Zaehler < 1000)
22
    {
23
        P = (Sollwert - Messwert);
24
        printf("P-Anteil = Sollwert - Istwert\n---> %f-%f=%f\n \n",Sollwert,Messwert,P);
25
        I = I_alt + P;
26
        printf("I-Anteil = P + alter I-Anteil\n---> %f+%f=%f\n \n",P,I_alt,I);
27
        D = P - P_alt;
28
        printf("D-Anteil = P - vorherigem P\n---> %f-%f=%f\n \n",P,P_alt,D);
29
30
        I_alt = I;
31
        P_alt = P;
32
        Messwert_alt = Messwert;
33
34
        Reglerwert = P*Kp + I*Ki + D*Kd;
35
        printf("Reglerwert = P*Kp + I*Ki + D*Kd\n---> %f*%f + %f*%f + %f*%f=%f\n \n",P,Kp,I,Ki,D,Kd,Reglerwert);
36
37
        Messwert = Messwert+Reglerwert;
38
        printf("Istwert = alter Istwert+Reglerwert\n---> %f+%f=%f\n \n \n \n \n \n",Messwert_alt,Reglerwert,Messwert);
39
40
      //  printf("Soll: %f       Ist: %f \n \nP: %f \nI: %f \nD: %f \n \nDaraus ergibt sich ein Reglerwert von %f\n \n \n \n \n",Sollwert,Messwert,P,I,D,Reglerwert);
41
        //printf(" Ist: %f",Messwert);
42
43
44
        //Modulo = (Modulo+1) % 10;
45
        if(Zaehler == 2)
46
        {
47
            int messwert;
48
            int sollwert;
49
            Zaehler ++;
50
            printf("Fuer Simulation einer Stoerung bitte neuen Istwert eingeben\n");
51
            scanf("%d", &messwert);
52
            fflush(stdin);
53
            printf("\n\n");
54
            printf("Bitte Sollwert eingeben, fuer keine Aenderung einfach den alten Wert eingeben\n");
55
            scanf("%d", &sollwert);
56
            fflush(stdin);
57
            printf("\n\n");
58
            printf("\n \n \n \n \n");
59
            fflush(stdin);
60
            Messwert = messwert;
61
            Sollwert = sollwert;
62
        }
63
64
    }
65
    return 0;
66
}



Und nochmal zur Kommandozeilenvariante eine Frage. Ich gehe in das 
Verzeichnis, in dem meine ReglerOhne_µC.exe liegt. Wenn ich dann im 
Verzeichnis ".....\Codeblocks\Projekte\ReglerOhne_µC\bin\debug" bin, und 
out > test.txt eingebe, sagt er "Befehl "out" ist entweder falsch 
geschrieben, oder konnte nicht gefunden werden. Wenn ich 
ReglerOhne_µC.exe out > test.txt eingebe, startet er zwar das Programm, 
aber es kommt kein txt-file.

P.S. ich hatte das ">" vergessen, nun macht er mir die txt. Danke 
schonmal dafür =)

MfG Chaos

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


Lesenswert?

j. t. schrieb:
> Wenn ich dann im
> Verzeichnis ".....\Codeblocks\Projekte\ReglerOhne_µC\bin\debug" bin, und
> out > test.txt eingebe, sagt er "Befehl "out" ist entweder falsch
> geschrieben, oder konnte nicht gefunden werden. Wenn ich
> ReglerOhne_µC.exe out > test.txt eingebe, startet er zwar das Programm,
> aber es kommt kein txt-file.

Das "out" war nur ein Platzhalter für den Namen der ausführbaren
Datei. ;-)

Wenn das Ding bei dir ReglerOhne_µC.exe heißt, dann rufst du auf:
1
ReglerOhne_µC > log.txt

von Georg G. (df2au)


Lesenswert?

j. t. schrieb:
> Wenn ich > ReglerOhne_µC.exe out > test.txt eingebe

Was soll das "out" bewirken? Dein Programm heißt Regler... und erwartet 
keine Parameter auf der Kommandozeile.

von Markus M. (mark_m)


Lesenswert?

j. t. schrieb:

> int fprintf( FILE          *stream, const char          *format, ... );
>
> Was bedeutet hier das *stream und das *format? Ich hab versucht, das so:
>
1
fprintf(test.txt "Reglerwert = P*Kp + I*Ki + D*Kd\n---> %f*%f + %f*%f
2
> + %f*%f=%f\n \n",P,Kp,I,Ki,D,Kd,Reglerwert);
 umzusetzen.
> Da hat er jedoch drei Fehler ausgegeben.
> "test.txt file or directory does not exist"
> "& file or directory does not exist"
> "ReglerOhne_µC file or directory does not exist"

Du solltest dich auch unbedingt daran halten, was dir vorgegeben wird! 
In C ein Komma zu ignorieren ist keine gute Idee. Da musst Du dich nicht 
wundern, dass dir Fehlermeldungen an den Kopf geworfen werden.

Wenn Du "fprintf" verwndest, musst Du natürlich erst mal eine Datei 
öffnen. Dafür ist die Funktion "fopen()" gedacht. Dieser Funktion darfst 
Du deinen Dateiname aufdrängen. Den Rückgabewert von "fopen()" kannst Du 
dann in "fprintf" einfügen.

Nach zu lesen in deinem Buch:
http://openbook.galileocomputing.de/c_von_a_bis_z/016_c_ein_ausgabe_funktionen_005.htm#mj47f082541eb4df9dbdcefdbc2775feae

Grüsse

von J. T. (chaoskind)


Lesenswert?

AHHH nun hab ich den Befehl auch verstanden. Ich dachte, das out wäre 
quasi die Anweisung, den Text dann "out"zugeben. Aber die Anweisung 
dafür ist dann wohl einfach das ">", und die *.txt ist natürlich der 
Ort, wo es hinsoll.

Danke euch, das hat geholfen.

Den Fehler in Codeblocks hab ich auch gefunden, ich hatte in einer 
Einstellung auch testhalber mal das ominöse &out>test.txt eingegeben. 
Komisch nur, das er trotzdem weitercompilieren konnte. Darüber ist er 
erst gestolpert, nachdem ich printf in fprintf geändert hatte. Wobei ich 
da direkt nochmal fprintf probieren werd!.

von Georg G. (df2au)


Lesenswert?

j. t. schrieb:
> Aber die Anweisung dafür ist dann wohl einfach das ">"

nicht ganz. Mit dem ">" leitest du alles von stdout um in ein neues 
File, dessen Name folgt. ">>" würde die Ausgabe an ein bestehendes File 
anhängen.

Das ist seit MSDOS 1.4 so.

von Wusel D. (stefanfrings_de)


Lesenswert?

Manchmal hlft es, die Tools, die man benutzt zu verstehen.

Wenn man die Programmiersprache zumindest in den Grundzügen verstanden 
hat, kann man sogar etwas Zustande bringen!

Und wenn man das Betriebsystem zu benutzen weiss, kann man sein eigenes 
Programm sogar starten.

Wer hätte das gedacht!

Benutze nicht soviel Zeugs, das Du nicht verstanden hast. Man sollte 
immer nur EINE einzige unbekannte Sache in ein ansonsten selbst 
erprobtes und verstandenes Konstrukt einbauen. Beherzige diesen Rat, 
dann wirst Du Dich nicht wieder so peinlich verrennen.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.