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
intmain(void){
5
printf("Diese Ausgabe soll in einer Textdatei stehen\n");
6
return0;
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.
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.
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!
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...
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
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
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:
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"
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.
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
intmesswert;
48
intsollwert;
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
return0;
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
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:
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.
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
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!.
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.
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.