Hallo an alle, ich brauche eure Hilfe. Und zwar ich möchte 4 Textdaten in einer Datei abspeichern. Bisher habe ich es geschaft die 4 Daten in 4 verschiedenen Dateien abzuspeichern. Programmiert habe ich es mit Labwindows CVI. Den folgende Code habe ich dem Anhang zugefügt Für eure Antworten wäre ich sehr Dankbar!
Jamie schrieb: > Bisher habe ich es geschaft die 4 Daten in 4 verschiedenen > Dateien abzuspeichern. Schön, dann reicht es doch dreimal fopen und fclose rauszuwerfen und die fprintf-Aufrufe anzupassen. Wo ist jetzt das Problem? > Programmiert habe ich es mit Labwindows CVI. Kenne ich nicht.
troll schrieb: >> Programmiert habe ich es mit Labwindows CVI. > Kenne ich nicht. irrelevant... Jamie schrieb: > Und zwar ich möchte 4 Textdaten in einer Datei > abspeichern. Bisher habe ich es geschaft die 4 Daten in 4 verschiedenen > Dateien abzuspeichern. > Programmiert habe ich es mit Labwindows CVI. Dann solltest du dir mal das Kapitel "Dateizugriff" in einem besseren C-Buch angucken. Dann würdest du es auch verstehen...
Hallo, also erstmal vielen Dank für eure Antworten. @troll: Den gedanken hatte ich auch aber ich dachte es gäbe eine spezeielle Funktion dafür. Ich habs geändert (siehe Code). Du hast mir sehr geholfen dankeschön. Falls im Code Verbesserungsmöglichkeiten gibts bitte bescheid sagen :) @STK500-Besitzer: Danke für deine Antwort. Ich mu erwähnen, dass ich erst seit einem Monat mit dem Programmieren angefangen habe. Zahlreiche Bücher gelesen habe. Die haben etwas geholfen aber nichts ist besser als learning bei doing. Innerhalb eines monats habe ich sehr viel gelernt. Laut deinen Namen beschäftigst du dich mit STK500. Ich möchte mir privat diesen kaufen oder irgendein anderes starter kit um das programmieren schneller zu lernen.Kannst du mir es empfehlen oder ist das eher für Experten? Grüße Jamie
Jamie schrieb: > sehr geholfen dankeschön. Falls im Code Verbesserungsmöglichkeiten gibts > bitte bescheid sagen :) > > > @STK500-Besitzer: Danke für deine Antwort. Ich mu erwähnen, dass ich > erst seit einem Monat mit dem Programmieren angefangen habe. Zahlreiche > Bücher gelesen habe. Es macht nicht viel Sinn wenn du die Bücher abends im Bett liest. Du musst die Dinge in den Büchern auch möglichst zeitnah ausprobieren. Sooooo lernst du was! Im anderen Fall erschlägt dich die Fülle der Information. > @troll: Den gedanken hatte ich auch aber ich dachte es gäbe eine > spezeielle Funktion dafür. Ich habs geändert (siehe Code). Du hast mir Und es hilft auch, wenn man ein wenig mitdenkt. Gerade Programmiersprachen leben davon, dass es eben nicht für alles und jedes eine Funktion dafür gibt, sondern dass man universelle Bausteine kombinieren kann. Dazu muss man aber seine Bausteine kennen! Und zwar so gut wie alle! zb ist es wenig sinnvoll, zwischendurch das File mittels fclose zu schliessen, wenn du danach noch darauf schreiben willst. die Kombination sprintf fputs kannst du getrost durch fprintf ersetzen. Dann brauchst du auch den ganzen String nicht mehr. Sowas
1 | strcpy(sLineCode, "Fehlercode\n\n"); |
2 | strcpy(sLineFST, "FST\n\n"); |
3 | strcpy(sLineFNR, "FNR\n\n"); |
4 | strcpy(sLineText, "Fehlertext\n\n"); |
5 | |
6 | for (i = 0; i < 8; i++) |
7 | {
|
8 | sprintf(&sLineCode[12+(i*9)], "%s\n", ErrorCode[i].sCode); |
9 | sprintf(&sLineFST[5+(i*3)], "%2d\n", iFST[i]); |
10 | sprintf(&sLineFNR[5+(i*3)], "%2d\n", iFNR[i]); |
11 | sprintf(&sLineText[12+(i*220)], "%s\n\n\n", ErrorCode[i].sText); |
12 | }
|
ist doch Unsinn. Warum das ganze auf mehrmals machen? Mach das doch in einem Rutsch! Jaaaaa, man kann durchaus in einem printf (oder sprintf oder fprintf) in einem Rutsch mehrere Dinge schreiben lassen! Ausserdem funktioniert das sowieso nur dann, wenn deine Error Codes richtig sind. Aber wozu der ganze Aufwand? Schreib die Dinge nacheinander aufs File und gut ists.
1 | case EVENT_COMMIT: |
2 | |
3 | sprintf( FileName, "C:\\Projekt\\%s.txt", sFilename1 ); |
4 | if ((file = fopen( FileName, "w")) == NULL) |
5 | {
|
6 | MessagePopup( "Fehler", "Fehler: konnte die Datei nicht öffnen" ); |
7 | return 0; |
8 | }
|
9 | |
10 | fprintf( file, "Fehlercode\n\n" ); |
11 | for (i = 0; i < 8; i++) |
12 | fprintf( file, "%s\n", ErrorCode[i].sCode ); |
13 | |
14 | fprintf( file, "FST\n\n"); |
15 | for (i = 0; i < 8; i++) |
16 | fprintf( file, "%2d\n", iFST[i] ); |
17 | |
18 | fprintf( file, "FNR\n\n"); |
19 | for (i = 0; i < 8; i++) |
20 | fprintf( file, "%2d\n", iFNR[i] ); |
21 | |
22 | fprintf( file, "Fehlertext\n\n" ); |
23 | for (i = 0; i < 8; i++) |
24 | fprintf( file, "%s\n\n\n", ErrorCode[i].sText); |
25 | |
26 | fclose (file); |
27 | |
28 | MessagePopup( "Info", "Gespeichert im Ordner Projekt" ); |
29 | break; |
30 | }
|
Da das allerdings so aussieht, als ob die jeweiligen i-ten Einträge alle zusammengehören, warum dann nicht einfach so?
1 | case EVENT_COMMIT: |
2 | |
3 | sprintf( FileName, "C:\\Projekt\\%s.txt", sFilename1 ); |
4 | if ((file = fopen( FileName, "w")) == NULL) |
5 | {
|
6 | MessagePopup( "Fehler", "Fehler: konnte die Datei nicht öffnen" ); |
7 | return 0; |
8 | }
|
9 | |
10 | fprintf( file, "Nr Code FST FNR Text\n" ); |
11 | for (i = 0; i < 8; i++) |
12 | fprintf( file, "%3d %10s %2d %2d %s\n", i, |
13 | ErrorCode[i].sCode, |
14 | iFST[i], |
15 | iFNR[i], |
16 | ErrorCode[i].sText ); |
17 | |
18 | fclose( file ); |
19 | |
20 | MessagePopup( "Info", "Gespeichert im Ordner Projekt" ); |
21 | break; |
22 | }
|
PS: return ist kein Funktionsaufruf. Wozu dann die Klammern? Die Syntax lautet return Ausdruck; Oder schreibst du auch i = (5); weil es übersichtlicher ist, einen einfachen Ausdruck in Klammern zu setzen? PS: Wenn man ein File nicht öffnen kann, dann ist das eine extrem gute Idee, wenn man das seinem Benutzer auch mitteilt! Denn das will der wissen, das da etwas Unvorhergesehenes passiert ist! Im Idealfall taucht in der Fehlermeldung dann auch der Dateiname auf, sonst rätselt man als Benutzer stundenlang WELCHE Datei nicht geschrieben werden konnte und zwar inklusive der Pfadangabe, damit man im Filesystem nachsehen kann, ob es da zb mit irgendwelchen Berechtigungen ein Problem gibt. Den Filenamen in die Meldung einzubauen überlasse ich als Übung dir. PS: Oft verzichtbar ist hingegen die Erfolgsmeldung. Wenn ich als Benutzer auf einen Button drücke, dann gehe ich als Benutzer davon aus, dass das Programm das macht was es soll und sich nur im Fehlerfall meldet. Ist das erwartungsgemäss eine Operation, die eher selten passiert, dann kann man auch schon eine Erfolgsmeldung ausgeben. Aber bei häufigen Operation wird dir dein Benutzer bald genervt eine bitterböse Mail schreiben, wenn er nur noch am Wegdrücken von Informations-Boxen ist, deren Inhalt ihn sowieso nicht interessiert. Ausserdem hat das oft auch einen psychologischen Effekt. Pappt ein Programm zuviele Message Boxen hoch, dann liest die kein Mensch mehr. Das sind dann die Fälle, in denen dich Benutzer anrufen und sagen: "Ich hab da eine Message Box mit einem Fehler". Rückfrage: "Welcher Fehler?". Benutzer: "Ja, gelesen hab ich die nicht!". PS: Ich hab aus deinem Code nicht rausbekommen, wie und wo du sFileName1 herbekommst. Das Zusammensetzen des Filenamens solltest du dir daher nochmal ansehen.
Vielen Dank Karl Heinz Buchegger, mir ist jetzt vieles klar geworden dank deiner Tipps. Einfach nachdenken hilft auch:-) Ich werde meinen Code optimieren und dank deiner Tipps weiter erfolgreich programmieren Hast du noch einen Tipp zu Microcontrollern Kits? Ich möchte dadurch das programmieren schneller lernen. Vielen Dank
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.