Forum: Compiler & IDEs Intelhex-File mit C einlesen


von Markus (Gast)


Lesenswert?

Hallo zusammen,

ich möchte ein Intelhex-File Zeile für Zeile einlesen. Das klappt auch 
soweit, aber er liest jedes Zeichen als char. Wie kann ich denn die 
Datenbytes gleich als Hexzahlen einlesen?

Ich habe versucht jedes Char-Paar über eine switch-Anweisung wieder 
zurück zu wandeln. Geht auch. Aber das muss doch auch einfacher gehen - 
oder?

Gruß
Markus

von Klaus W. (mfgkw)


Lesenswert?

Mit scanf() bzw. sscanf()

von Markus (Gast)


Lesenswert?

Das habe ich bisher verbrochen:

    FILE *fil;
    char buffer[16];
    fil = fopen("test.hex", "r");

    if (fil == NULL) {
        printf("\nDatei test.txt kann nicht geöffent werden\n");
        exit(-1);
    }

    while(!feof(fil)) {

    fgets (zeichen, LINE_LENGTH, fil);
    if (!feof(fil)) printf("%.*s",LINE_LENGTH, zeichen);
    }

    fclose (fil);


Ziel soll sein, dass ich aus jeder Zeile die 16 Datenbytes herausziehe 
und in einen Array (buffer) schreibe.

von Karl H. (kbuchegg)


Lesenswert?

Markus schrieb:
> Das habe ich bisher verbrochen:
>
>     FILE *fil;
>     char buffer[16];

nicht char.
char benutzt du ausscchliesslich für Buffer die reinen Text enthalten. 
Du willst letztendlich Bytes formen. Also nimmst du unsigned char.

>     fil = fopen("test.hex", "r");
>
>     if (fil == NULL) {
>         printf("\nDatei test.txt kann nicht geöffent werden\n");
>         exit(-1);
>     }
>
>     while(!feof(fil)) {

Falsch.
feof ist ein Test mit dem man hinterher feststellt, warum eine 
Leseoperation schief gelaufen ist. Die zentrale Einleseschleife wird 
niemals von feof abhängig gemacht. In C liefert jede Lesefunktion einen 
Returnwert, aus dem sich ablesen lässt, ob die Operation gut gegangen 
ist oder nicht.

Achtung: Eine Leseoperation kann aus vielen Gründen schief gehen, nicht 
nur EOF. NIcht zuletzt deshalb ist es auch unlogisch, die while Schleife 
auf feof basieren zu lassen.


>
>     fgets (zeichen, LINE_LENGTH, fil);

ist schon mal ein guter Anfang.

> Ziel soll sein, dass ich aus jeder Zeile die 16 Datenbytes herausziehe
> und in einen Array (buffer) schreibe.

Bleib bei der Strategie erst mal eine Zeile komplett einzulesen. Hast du 
sie erst mal als String im Speicher, kannst du sie in aller Ruhe 
zerlegen und analysieren. Vor allen Dingen in Fehlerfällen ist das 
einfacher, als wenn man gleich beim Einlesen die Zeile zerlegen lassen 
will

1
    FILE *fil;
2
    unsigned char buffer[16];
3
    fil = fopen("test.hex", "r");
4
5
    if (fil == NULL) {
6
        printf("\nDatei test.txt kann nicht geöffent werden\n");
7
        exit(-1);
8
    }
9
10
    while( fgets (zeichen, LINE_LENGTH, fil) ) {
11
      printf("%.*s",LINE_LENGTH, zeichen);
12
    }
13
14
    if( !feof(fil) )
15
      printf( "Fehler beim Einlesen der Datei!\n" );
16
17
    fclose (fil);

So sieht die klassische Leseschleife in C aus.

Als nächstes siehst du dir den Aufbau einer Zeile an.
Und du liest über sscanf (bzw.) scanf in deinem C-Buch nach, ob und wie 
du mit dem Formatstring sscanf dazu bringen kannst, die ganze Arbeit für 
dich zu machen.

> Ich habe versucht jedes Char-Paar über eine switch-Anweisung wieder
> zurück zu wandeln.

Das ist ein bischen aufwändig. Das geht auch deutlich einfacher.
Wenn du mit sscanf nicht klar kommst, dann schreib dir eine Funktion, 
die 2 Zeichen übernimmt, diese als ASCII Repräsentierung von Hex-Digits 
interpretiert und daraus das Byte zusammensetzt.
Es gibt einen Zusammenhang zwischen dem ASCII Code von Ziffern und 
Zeichen und dem was man binär daraus generieren will.

Das ASCII Zeichen für '0' hat den ASSCII Code 0x30
Das Zeichen '1' hat den ASCII Code 0x31, etc. für alle Ziffern.

Zieht man daher von einem Zeichen den ASCII Code von '0' ab, dann hat 
man unmittelbar die Zahl die diesem Zeichen entspricht. Bei den 
Buchstaben 'A' bis 'F' ist es ähnlich.
Dein erstes Ziel: SChreib eine Funktion, der du 1 Zeichen vorgibst, 
welches entweder '0'..'9' oder 'A'..'F' sein kann, und welches dir 
daraus eine Zahl 0..15 errechnet, je nach Zeichen.

von Klaus W. (mfgkw)


Lesenswert?

Auch wenn es KHB sauer aufstößt, daß ich nicht erst eine Zeile
einlese (was sicher auch nicht falsch wäre), hier ein Beispiel
mit allen nötigen scanf-Formaten:
1
/* Time-stamp: "09.09.10 22:08 intelhex.c klaus?wachtler.de"
2
 *
3
 * Lesen einer Intel-Hex-Datei
4
 *
5
 * [1] http://de.wikipedia.org/wiki/Intel_HEX
6
 *
7
 */
8
9
#include <stdlib.h>
10
#include <stddef.h>
11
#include <stdio.h>
12
#include <string.h>
13
#include <stdint.h>
14
15
16
int main( int nargs, char **args )
17
{
18
  FILE            *f      = fopen( "a.hex", "r" );
19
  unsigned long    iZeile = 0;
20
  uint8_t          data[128];    // Platz für Daten aus einer Zeile
21
22
  if( f )
23
  {
24
    while( "mehr daten" )
25
    {
26
      unsigned int    bytecount, address, recordtype, checksum;
27
28
      iZeile++;
29
      if( fscanf( f, " :%2x%4x%2x", &bytecount, &address, &recordtype )!=3 )
30
      {
31
        fprintf( stderr, "Zeilenstart nicht lesbar in Zeile %lu\n", iZeile );
32
        return 1;
33
      }
34
      else if( bytecount>sizeof(data) )
35
      {
36
        fprintf( stderr, "Zeile zu lang\n" );
37
        return 1;
38
      }
39
      else if( recordtype==1 )
40
      {
41
        fprintf( stderr, "End of file erreicht\n" );
42
        break;
43
      }
44
      else if( recordtype!=0 )
45
      {
46
        fprintf( stderr, "Recordtyp unbekannt, ignoriert\n" );
47
        continue;
48
      }
49
      else
50
      {
51
        unsigned int    own_checksum = 0;
52
        own_checksum -= bytecount;
53
        own_checksum -= ( address & 0xFF ) + (address >> 8);
54
        own_checksum -= recordtype;
55
        unsigned int iDatabyte;
56
        for( iDatabyte=0; iDatabyte<bytecount; ++iDatabyte )
57
        {
58
          unsigned int    c;
59
          if( fscanf( f, "%2x", &c )!=1 )
60
          {
61
            fprintf( stderr, "Zeichen %d in Zeile %lu nicht lesbar\n",
62
                     iDatabyte,
63
                     iZeile
64
                     );
65
            return 1;
66
          }
67
          else
68
          {
69
            // ok, Zeichen gelesen
70
            data[iDatabyte] = c;
71
            own_checksum -= data[iDatabyte];
72
          }
73
        }
74
        if( fscanf( f, "%2x", &checksum )!=1 )
75
        {
76
          fprintf( stderr, "Lesefehler bei Checksumme in Zeile %lu\n", iZeile );
77
          return 1;
78
        }
79
        else
80
        {
81
          // Checksumme vergleichen:
82
          fprintf( stderr, "Checksumme %02x %02x\n", own_checksum&0xFF, checksum );
83
        }
84
85
        // Kontrollausgabe:
86
        unsigned int iZeichen;
87
        printf( "adr=%04x ", address );
88
        for( iZeichen=0; iZeichen<bytecount; ++iZeichen )
89
        {
90
          printf( " 0x%02x", data[iZeichen] );
91
        }
92
        printf( "\n" );
93
94
      }
95
    }
96
  }
97
  else
98
  {
99
    fprintf( stderr, "Datei nicht zu oeffnen\n" );
100
  }
101
102
103
  return 0;
104
}

Die Datei wird nicht geschlossen, aber das ist mir für das Beispiel 
egal.
Außerdem könnte man noch die Adressen kontrollieren.

Meine Beispieldatei:
1
:100000000C94B9000C94D6000C94D6000C94D60035
2
:100010000C94D6000C94D6000C94D6000C94D60008
3
:100020000C94D6000C94D6000C94D6000C94D600F8
4
...
5
:101668006E76616C6964005769647468546F6F536F
6
:081678006D616C6C003F000085
7
:00000001FF

Die Ausgabe:
1
Checksumme 35 35
2
adr=0000  0x0c 0x94 0xb9 0x00 0x0c 0x94 0xd6 0x00 0x0c 0x94 0xd6 0x00 0x0c 0x94 0xd6 0x00
3
Checksumme 08 08
4
adr=0010  0x0c 0x94 0xd6 0x00 0x0c 0x94 0xd6 0x00 0x0c 0x94 0xd6 0x00 0x0c 0x94 0xd6 0x00
5
Checksumme f8 f8
6
adr=0020  0x0c 0x94 0xd6 0x00 0x0c 0x94 0xd6 0x00 0x0c 0x94 0xd6 0x00 0x0c 0x94 0xd6 0x00
7
...
8
Checksumme 6f 6f
9
adr=1668  0x6e 0x76 0x61 0x6c 0x69 0x64 0x00 0x57 0x69 0x64 0x74 0x68 0x54 0x6f 0x6f 0x53
10
Checksumme 85 85
11
adr=1678  0x6d 0x61 0x6c 0x6c 0x00 0x3f 0x00 0x00
12
End of file erreicht

von Markus (Gast)


Lesenswert?

Vielen Dank euch beiden!

Da habe ich erstmal genügend Stoff, mit dem ich mich beschäftigen kann. 
:-)

von Karl H. (kbuchegg)


Lesenswert?

Klaus Wachtler schrieb:
> Auch wenn es KHB sauer aufstößt, daß ich nicht erst eine Zeile
> einlese

LOL
Stösst mir überhaupt nicht sauer auf.

Dein Programm wird sich nur hier
1
      else if( recordtype!=0 )
2
      {
3
        fprintf( stderr, "Recordtyp unbekannt, ignoriert\n" );
4
        continue;
5
      }
schwer tun, sich wieder auf den nächsten Datensatz zu synchronisieren.
(Ich weiß, man kann das beheben)

von Klaus W. (mfgkw)


Lesenswert?

wohl war.
Du willst bestimmt drauf raus, daß man erst die ganze Zeile liest?

Wobei ich gar nicht weiß, ob es Sinn macht, bei anderen
Typen einfach stillschweigend weiter zu machen.
Wenn die vorkommen (?), müssen sie auch vrmtl. behandelt werden

von Markus (Gast)


Lesenswert?

Alles was bei mir momentan rauskommt ist folgendes:

Recordtyp unbekannt, ignoriert
Zeilenstart nicht lesbar in Zeile 2


Da werde ich wohl noch etwas anpassen müssen. ;-)

Der Start von meinem Hexfile sieht übrigens so aus:

:020000040000FA
:10000000EA00FF32EA0067FEEA006ECEEA0067E02F
:10001000EA0067C3EAFFFFFEEA006293EA006C4071
:1000200047D4AB7B000213380400002000106B059E
:10003000000000030003FFE0BDFA1FF77F352265D3
...

von Klaus W. (mfgkw)


Lesenswert?

Schau doch mal den Link am Anfang von meinem Quelltext an!
Da ist das Format beschrieben.

Ich habe in meinem Beispiel nur die Typen 0 (Daten) und 1 (EOF).
Deshalb habe ich mein Beispielprogramm nur darauf abgestellt.

Bei dir ist die erste Zeile etwas ganz anderes: Typ 2
(Extended Segment Address Record/Real Mode-Adressierung).

Das heißt, du musst diesen Fall im if...else if... auch abfangen
und mehr oder weniger sinnvoll darauf reagieren.
Das kannst du bestimmt selber...

von Karl H. (kbuchegg)


Lesenswert?

Klaus Wachtler schrieb:
> wohl war.
> Du willst bestimmt drauf raus, daß man erst die ganze Zeile liest?

Ich denke für jemanden (den TO) der das erste mal ein File einliest, ist 
das gut genug. Das passt schon.

Für mich persönlich würde ich eine Kombi machen.
Ist doch simpel die Zeile zunächst mittels fgets einzulesen und dann im 
Prinzip deinen Code zu nehmen, die fprintf durch sscanf ersetzen, noch 
einen char-Pointer als 'File-Pointer' und läuft schon.

Aber das ist für den TO sicherlich jetzt noch nicht notwendig. 
File-einlesen absolut abzusichern, so dass nichts passieren kann, ist 
für uns Profis eine Notwendigkeit (egal was ein Kunde dieser Funktion 
vorsetzt, sie darf Fehlermeldungen werfen so viele sie will, nur 
abstürzen darf sie auf keinen Fall) für den Heimgebrauch kann man ruhig 
die Ansprüche runterschrauben.

>
> Wobei ich gar nicht weiß, ob es Sinn macht, bei anderen
> Typen einfach stillschweigend weiter zu machen.

Kann ich nicht sagen.
Gibts im Intel-Hex Format überhaupt noch andere Codes?

Fass den Einwand, den ich da vorgebracht habe bloss nicht als Kritik um 
der Kritik willen auf. So war das ganz sicher nicht gedacht.

von Klaus W. (mfgkw)


Lesenswert?

Klaus Wachtler schrieb:
> Bei dir ist die erste Zeile etwas ganz anderes: Typ 2
> (Extended Segment Address Record/Real Mode-Adressierung).

Korrektur: du hast hier Typ 4 (Extended Linear Address
Record/32Bit-Adressierung).

von Klaus W. (mfgkw)


Lesenswert?

Karl heinz Buchegger schrieb:
> Kann ich nicht sagen.
> Gibts im Intel-Hex Format überhaupt noch andere Codes?

Angeblich 6 Stück.
http://de.wikipedia.org/wiki/Intel_HEX


> Fass den Einwand, den ich da vorgebracht habe bloss nicht als Kritik um
> der Kritik willen auf. So war das ganz sicher nicht gedacht.
:-)

So sensibel bin ich nicht. Als Maschinenbauer eher gefühl- und 
regungslos.

von Markus (Gast)


Lesenswert?

Karl heinz Buchegger schrieb:
> ein Programm wird sich nur hier      else if( recordtype!=0 )
>       {
>         fprintf( stderr, "Recordtyp unbekannt, ignoriert\n" );
>         continue;
>       }
> schwer tun, sich wieder auf den nächsten Datensatz zu synchronisieren.
> (Ich weiß, man kann das beheben)

Genau dieses Problem habe ich gerade noch... ;-)

den Typ 4 fange ich bereits ab... aber hier fehlt es mir noch.

von Karl H. (kbuchegg)


Lesenswert?

Markus schrieb:

>> schwer tun, sich wieder auf den nächsten Datensatz zu synchronisieren.
>> (Ich weiß, man kann das beheben)
>
> Genau dieses Problem habe ich gerade noch... ;-)
>
> den Typ 4 fange ich bereits ab... aber hier fehlt es mir noch.

Und genau deswegen hab ich in letzter Zeit immer mehr Bauchweh, wenn 
fertige Lösungen präsentiert werden.
Hand aufs Herz: Du hast noch nicht nachgelesen wie die Einzelteile, die 
du noch nicht verstehst eigentlich funktionieren.

von holger (Gast)


Lesenswert?

>den Typ 4 fange ich bereits ab... aber hier fehlt es mir noch.

Schmeiß die Zeile weg, der Offset ist Null;)

von Markus (Gast)


Lesenswert?

nein habe ich nicht... ich bin gerade dabei den Code Stück für Stück 
auseinanderzunehmen. Und "fertige" Lösungen nehme ich trotzdem 
auseinander - so viel Ehrgeiz habe ich, dass ich mir das anschaue und 
verstehen möchte. Man lernt dabei unheimlich viel!

von Klaus W. (mfgkw)


Lesenswert?

Eben, hast ja noch viel Zeit bis morgen früh.

von Karl H. (kbuchegg)


Lesenswert?

holger schrieb:
>>den Typ 4 fange ich bereits ab... aber hier fehlt es mir noch.
>
> Schmeiß die Zeile weg, der Offset ist Null;)

Kann er nicht.
Er muss sie schon lesen, sonst geht die Synchronisierung verloren und er 
findet den nächsten Zeilenanfang nicht.
Liest er sie aber, dann kann er auch gleich die Zahlenwerte rausholen. 
Ob er damit was macht, ist eine andere Geschicht. Aber der einfachste 
Weg ist es in diesem Fall tatsächlich, die Zeile zu ende zu lesen. Ist 
ja nur noch eine 2 Byte Zahl und die Checksumme. Wenn er mit 
Formatstrings umgehen kann (und sich bei den anderen Daten ansieht wie 
Klaus ihm das vorgemacht hat), ist das nicht weiter schwer.

von Klaus W. (mfgkw)


Lesenswert?

Mit scanf kann man auch überlesen, ohne etwas zu nutzen (mit einem *).
Da kann man jetzt streiten, ob es "wegwerfen" ist oder "lesen".

von Karl H. (kbuchegg)


Lesenswert?

Klaus Wachtler schrieb:
> Mit scanf kann man auch überlesen, ohne etwas zu nutzen (mit einem *).
> Da kann man jetzt streiten, ob es "wegwerfen" ist oder "lesen".

Lass ihn mal die Standardsachen im Formatstring erlernen, ehe du mit den 
Spezialitäten kommst :-)
Die 2 zusätzlichen Variablen, die er dann noch braucht, bringen ihn auch 
nicht um :-) und der Rest ist Kontrolle, ob er den Aufbau eines 
Formatstrings verstanden hat.

von Markus (Gast)


Lesenswert?

hab den Code recht schnell kapiert und das Problem mit folgender Zeile 
gelöst:

fscanf( f, "%4x%2x", &storage_address, &checksum);


wie kann man mit "*" die 6 Zeichen überlesen? neugier

von Klaus W. (mfgkw)


Lesenswert?

fscanf( f, "%*4x%*2x" );

Siehe die Doku zu scanf....

http://www.wachtler.de/ck/19_4_Liste_Funktionen.html#SECTION0002049200000000000000

von Markus (Gast)


Lesenswert?

Vielen Dank nochmals für die super Hilfe und die ganzen Tips.

von Oliver (Gast)


Angehängte Dateien:

Lesenswert?

Hallo Ihr Lieben,

vor vielen, vielen Jahren habe ich mich ganz passabel in GFA-Basic 
ausgekannt und damit so einiges programmiert. Nun mache ich meine ersten 
Schritte in C++, trotz einiger Ähnlichkeiten sehe ich mich zwangsläufig 
also darin noch als Anfänger.

Nun möchte ich für ein opensource Projekt www.opcar.de ein ganz 
einfaches Tool entwickeln, mehrere in einer eep Datei gespeichertes CVs 
ändern zu können, diese geänderten CVs anschließend wieder in eine eep 
Datei zurück zuschreiben um diese dann mit dem AVRootloader in die 
Fahrzeuge zu schreiben.  Auf jegliche Grafik soll bewusst verzichtet 
werden, ein reines Zweckwerkzeug.

Bei meinen Recherchen bin ich auf diesen Beitrag hier gestoßen und habe 
den veröffentlichten Code an meine Bedürfnisse angepasst. Damit lassen 
sich die CVs einlesen und bearbeiten. Für diejenigen, die damit 
"spielen" wollen, ist eine erforderliche eep angehängt.

Nun möchte das Rückschreiben in die eep Datei schreiben, stoße dabei 
aber an meine Grenzen. Wenn ich es richtig verstanden habe, muss ich

1) immer 15 CVs in einem String zusammenfassen
2) Zeilennummer ergänzen
3) Prüfsumme neu berechnen
4) Zeilenweise in Datei schreiben

Aber wie ? Könnt Ihr bitte helfen. Vielen Dank.
1
#include <iostream>
2
#include <stdlib.h>
3
#include <stddef.h>
4
#include <stdio.h>
5
#include <string.h>
6
#include <stdint.h>
7
#include <iomanip>
8
9
using namespace std;
10
11
int main(void)
12
{
13
int cv = 0;
14
int max_cv;
15
int cv_wert [255];
16
int cv_auswahl;
17
int cv_wert_neu; // Variablen für Datenübernahme einrichten
18
char pruefung;
19
        
20
//Den folgenden Code habe ich dem Beitrag von Klaus Wachtler auf der Seite http://www.mikrocontroller.net/topic/189911
21
//entnommen und in Teilen angepasst    
22
    
23
  FILE            *f      = fopen( "open_car.eep", "r" );
24
  unsigned long    iZeile = 0;
25
  uint8_t          data[128];    // Platz für Daten aus einer Zeile
26
27
  if( f )
28
  {
29
    while( "mehr daten" )
30
    {
31
      unsigned int    bytecount, address, recordtype, checksum;
32
33
      iZeile++;
34
      if( fscanf( f, " :%2x%4x%2x", &bytecount, &address, &recordtype )!=3 )
35
      {
36
        fprintf( stderr, "Zeilenstart nicht lesbar in Zeile %lu\n", iZeile );
37
        //return 1;
38
      }
39
      else if( bytecount>sizeof(data) )
40
      {
41
        fprintf( stderr, "Zeile zu lang\n" );
42
        //return 1;
43
      }
44
      else if( recordtype==1 )
45
      {
46
        fprintf( stderr, "Ende der Datei erreicht\n" );
47
        cout <<"Insgesamt ";
48
        max_cv = cv-1;
49
        cout << max_cv;
50
        cout <<" CVs gelesen\n";
51
        cout << "\n";
52
        break;
53
      }
54
      else if( recordtype!=0 )
55
      {
56
        fprintf( stderr, "Recordtyp unbekannt, ignoriert\n" );
57
        continue;
58
      }
59
      else
60
      {
61
        unsigned int    own_checksum = 0;
62
        own_checksum -= bytecount;
63
        own_checksum -= ( address & 0xFF ) + (address >> 8);
64
        own_checksum -= recordtype;
65
        unsigned int iDatabyte;
66
        for( iDatabyte=0; iDatabyte<bytecount; ++iDatabyte )
67
        {
68
          unsigned int    c;
69
          if( fscanf( f, "%2x", &c )!=1 )
70
          {
71
            fprintf( stderr, "Zeichen %d in Zeile %lu nicht lesbar\n",
72
                     iDatabyte,
73
                     iZeile
74
                     );
75
            //return 1;
76
          }
77
          else
78
          {
79
            // ok, Zeichen gelesen
80
            data[iDatabyte] = c;
81
            own_checksum -= data[iDatabyte];
82
          }
83
        }
84
        if( fscanf( f, "%2x", &checksum )!=1 )
85
        {
86
          fprintf( stderr, "Lesefehler bei Checksumme in Zeile %lu\n", iZeile );
87
          //return 1;
88
        }
89
        else
90
        {
91
          // Checksumme vergleichen:
92
          //fprintf( stderr, "Checksumme %02x %02x\n", own_checksum&0xFF, checksum );
93
        }
94
95
        // Kontrollausgabe:
96
    unsigned int iZeichen;
97
        //printf( "adr=%04x \n", address );
98
        
99
        for( iZeichen=0; iZeichen<bytecount; ++iZeichen )
100
        {
101
          cv_wert[cv] = data[iZeichen];
102
      ++cv;
103
          }
104
        }
105
    }
106
  }
107
  else
108
  {
109
    fprintf( stderr, "Datei nicht zu oeffnen\n" );
110
  }
111
112
// Ab hier geht jetzt selber weiter   
113
// Jetzt Daten anzeigen ********************************************************
114
cout << "Um die Daten anzuzeigen Taste druecken  \n";
115
cin.get();
116
117
while (cv_auswahl != 0)
118
{
119
  for( cv=1; cv<=max_cv; ++cv )
120
  {
121
    cout << "CV [" << setw(3) << cv <<"]: " << setw (3) << cv_wert [cv] << " \t";
122
  }
123
  cout << "\n";
124
  
125
// Und jetzt ändern ************************************************************
126
    cout << "Welche CV moechtest Du aendern ? [0=Exit]";
127
    cin >> cv_auswahl;
128
    
129
    if (cv_auswahl != 0)
130
       {
131
     cout << "Ok. CV [" << cv_auswahl << "] hat momentan den Wert " << cv_wert [cv_auswahl] << "\n" << "Neuer Wert ?";
132
       cin >> cv_wert_neu;
133
    
134
// Nochmal prüfen **************************************************************
135
       cout << "Ok. CV [" << cv_auswahl << "] hat noch den Wert "  << cv_wert [cv_auswahl] <<  ". Neuer Wert " << cv_wert_neu <<".\n";
136
       cout << "Wirklich aendern [j/n] ? ";
137
       cin >> pruefung;
138
     if (pruefung == 'j')
139
     {
140
      cv_wert [cv_auswahl] = cv_wert_neu;
141
      }
142
  }
143
}
144
cout << "\n";
145
cout << "CV-Werte nach Aenderung \n";
146
for( cv=1; cv<=max_cv; ++cv ) //nochmal zur Prüfung anzeigen
147
  {
148
    cout << "CV [" << setw(3) << cv <<"]: " << setw(3) << cv_wert [cv] << " \t";
149
  }
150
  cout <<"\n";
151
  cout <<"Diese Werte speichern [j/n]?\n";
152
  cin >> pruefung;
153
  
154
//Und jetzt Daten zurückschreiben
155
  if (pruefung == 'j')
156
     {
157
    
158
    }
159
          
160
      
161
  
162
  cin.get();
163
  return 0;    
164
}

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.