Forum: PC-Programmierung Speichern der Fertigungsdaten in einer Datei


von Jamie (Gast)


Angehängte Dateien:

Lesenswert?

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!

von troll (Gast)


Lesenswert?

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.

von STK500-Besitzer (Gast)


Lesenswert?

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...

von Jamie (Gast)


Angehängte Dateien:

Lesenswert?

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

von Karl H. (kbuchegg)


Lesenswert?

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.

von Jamie (Gast)


Lesenswert?

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
Noch kein Account? Hier anmelden.