Forum: Mikrocontroller und Digitale Elektronik Arduino SDFat-Libary Bestimmte Zeile in einer txt ändern/schreiben


von Nitram E. (slexx)


Lesenswert?

Guten Abend,

ich stehe gerade vor dem Problem dass ich nicht weiß wie ich eine 
bestimmte Zeile in einer txt ändern kann.
Ich habe im Internet gefunden dass es den ssek bzw positions Befehl gibt 
aber wie wende ich das an.
Wie würde es in der loop schleife aussehen wenn ich später den nachname 
in Zeile 13 ändern möchte.
Eingaben werden später per Touch übergeben. Kann mir bitte jemand 
helfen? :(

hier der code, hier werden nur parameter von der sd karte gelesen was 
auch funktioniert aber wie ich z.b. in der loop den namen ändern kann 
weiß ich nicht:

1
#include <SPI.h>
2
#include <SdFat.h>
3
int chipSelect = 10;                                         // SD card chip select pin
4
//Parameter von der SD Karte (NETWORK.TXT)
5
byte SD_Status = 0;
6
int Januar[4]   = { 0, 0, 0, 0};
7
int Februar[4]  = { 0, 0, 0, 0};
8
int Maerz[4]    = { 0, 0, 0, 0};
9
int April[4]  = { 0, 0, 0, 0};
10
int Mai[4]   = { 0, 0, 0, 0};
11
int Juni[4]  = { 0, 0, 0, 0};
12
int Juli[4]    = { 0, 0, 0, 0};
13
int August[4]  = { 0, 0, 0, 0};
14
int September[4]   = { 0, 0, 0, 0};
15
int Oktober[4]  = { 0, 0, 0, 0};
16
int November[4]    = { 0, 0, 0, 0};
17
int Dezember[4]  = { 0, 0, 0, 0};
18
char vorname[20];
19
char nachname[20];
20
char null_null[20];
21
SdFat sd;                                                   // file system auf SD-Karte
22
 
23
void setup()
24
{
25
26
  Serial.begin(9600);
27
 
28
  //Serial.println("Initialisiere SD-Karte...");
29
  if(!sd.begin(chipSelect, SPI_HALF_SPEED)) 
30
  {
31
    Serial.println("- Fehler beim initialisieren der SD-Karte!\n");
32
    sd.initErrorHalt();
33
  } else 
34
  
35
  Serial.println("SD Karte erfolgreich initialisiert.");
36
37
  readNetworkSettingsFromSD();
38
39
  Serial.print("Januar:   ");Serial.print(Januar[0]);Serial.print(".");Serial.print(Januar[1]);Serial.print("  ");Serial.print(Januar[2]);Serial.print(".");Serial.println(Januar[3]);
40
  Serial.print("Februar:  ");Serial.print(Februar[0]);Serial.print(".");Serial.print(Februar[1]);Serial.print("  ");Serial.print(Februar[2]);Serial.print(".");Serial.println(Februar[3]);
41
  Serial.print("März:     ");Serial.print(Maerz[0]);Serial.print(".");Serial.print(Maerz[1]);Serial.print("  ");Serial.print(Maerz[2]);Serial.print(".");Serial.println(Maerz[3]);
42
  Serial.print("April:    ");Serial.print(April[0]);Serial.print(".");Serial.print(April[1]);Serial.print("  ");Serial.print(April[2]);Serial.print(".");Serial.println(April[3]);
43
  Serial.print("Mai:      ");Serial.print(Mai[0]);Serial.print(".");Serial.print(Mai[1]);Serial.print("  ");Serial.print(Mai[2]);Serial.print(".");Serial.println(Mai[3]);
44
  Serial.print("Juni:     ");Serial.print(Juni[0]);Serial.print(".");Serial.print(Juni[1]);Serial.print("  ");Serial.print(Juni[2]);Serial.print(".");Serial.println(Juni[3]);
45
  Serial.print("Juli:     ");Serial.print(Juli[0]);Serial.print(".");Serial.print(Juli[1]);Serial.print("  ");Serial.print(Juli[2]);Serial.print(".");Serial.println(Juli[3]);
46
  Serial.print("August:   ");Serial.print(August[0]);Serial.print(".");Serial.print(August[1]);Serial.print("  ");Serial.print(August[2]);Serial.print(".");Serial.println(August[3]);
47
  Serial.print("September:");Serial.print(September[0]);Serial.print(".");Serial.print(September[1]);Serial.print("  ");Serial.print(September[2]);Serial.print(".");Serial.println(September[3]);
48
  Serial.print("Oktober:  ");Serial.print(Oktober[0]);Serial.print(".");Serial.print(Oktober[1]);Serial.print("  ");Serial.print(Oktober[2]);Serial.print(".");Serial.println(Oktober[3]);
49
  Serial.print("November: ");Serial.print(November[0]);Serial.print(".");Serial.print(November[1]);Serial.print("  ");Serial.print(November[2]);Serial.print(".");Serial.println(November[3]);
50
  Serial.print("Dezember: ");Serial.print(Dezember[0]);Serial.print(".");Serial.print(Dezember[1]);Serial.print("  ");Serial.print(Dezember[2]);Serial.print(".");Serial.println(Dezember[3]);
51
  Serial.println(vorname);
52
  Serial.println(nachname);
53
  Serial.println(null_null);
54
  if(SD_Status==1){
55
  Serial.println("Parameter erfolgreich geladen.");}
56
57
58
  /*
59
  unsigned long number = strtoul( serverurl, NULL, 10 );
60
  Serial.println(number);
61
  */
62
63
}
64
 
65
/* Parameter Zeilenweise aus Textdatei von SD-Karte laden */
66
void readNetworkSettingsFromSD() 
67
{
68
  SdFile myFile("PARAMETER.TXT", O_RDWR);
69
  char netBuffer[50];
70
  if (myFile.isOpen()) 
71
  {
72
    int chPos = 0;
73
    int lineNo = 0;
74
    SD_Status = 1;
75
 
76
    while (myFile.available())
77
    {
78
      char ch = myFile.read();
79
 
80
      if(ch == '\n') // '\r' oder '\n'
81
      {
82
        chPos = 0;
83
84
        if(lineNo==0){sscanf(netBuffer,"%u.%u-%u.%u",&Januar[0],&Januar[1],&Januar[2],&Januar[3]);}
85
        if(lineNo==1){sscanf(netBuffer,"%u.%u-%u.%u",&Februar[0],&Februar[1],&Februar[2],&Februar[3]);}
86
        if(lineNo==2){sscanf(netBuffer,"%u.%u-%u.%u",&Maerz[0],&Maerz[1],&Maerz[2],&Maerz[3]);}
87
        if(lineNo==3){sscanf(netBuffer,"%u.%u-%u.%u",&April[0],&April[1],&April[2],&April[3]);}
88
        if(lineNo==4){sscanf(netBuffer,"%u.%u-%u.%u",&Mai[0],&Mai[1],&Mai[2],&Mai[3]);}
89
        if(lineNo==5){sscanf(netBuffer,"%u.%u-%u.%u",&Juni[0],&Juni[1],&Juni[2],&Juni[3]);}
90
        if(lineNo==6){sscanf(netBuffer,"%u.%u-%u.%u",&Juli[0],&Juli[1],&Juli[2],&Juli[3]);}
91
        if(lineNo==7){sscanf(netBuffer,"%u.%u-%u.%u",&August[0],&August[1],&August[2],&August[3]);}
92
        if(lineNo==8){sscanf(netBuffer,"%u.%u-%u.%u",&September[0],&September[1],&September[2],&September[3]);}
93
        if(lineNo==9){sscanf(netBuffer,"%u.%u-%u.%u",&Oktober[0],&Oktober[1],&Oktober[2],&Oktober[3]);}
94
        if(lineNo==10){sscanf(netBuffer,"%u.%u-%u.%u",&November[0],&November[1],&November[2],&November[3]);}
95
        if(lineNo==11){sscanf(netBuffer,"%u.%u-%u.%u",&Dezember[0],&Dezember[1],&Dezember[2],&Dezember[3]);}
96
        if(lineNo==12){sscanf(netBuffer,"%s",vorname);}
97
        if(lineNo==13){sscanf(netBuffer,"%s",nachname);}
98
        if(lineNo==14){sscanf(netBuffer,"%s",null_null);}
99
        
100
        lineNo++;
101
      } 
102
      
103
      // if(ch == '\n') // '\r' oder '\n'
104
      else if(ch == '\r') 
105
      {
106
      }
107
      else if(chPos < 100) 
108
      {        
109
        netBuffer[chPos] = ch;
110
        chPos++;
111
        netBuffer[chPos] = 0;
112
      }
113
    } // while (myFile.available())
114
 
115
    myFile.close();
116
  } // if (myFile.isOpen())
117
  else
118
  {
119
    Serial.println("Fehler beim ermitteln der Parameter!");
120
    sd.initErrorHalt();
121
  }
122
}
123
 
124
void loop()
125
{
126
  SdFile myFile("PARAMETER.TXT", O_RDWR);
127
 if (myFile.isOpen()) 
128
 {
129
130
131
  }
132
}

von Nitram E. (slexx)


Lesenswert?

Keiner eine Idee? :(

von Nitram E. (slexx)


Lesenswert?

Kann mir wirklich keiner helfen hier? :(

von Heiko G. (heikog)


Lesenswert?

Du musst im allgemeinen die Textdatei komplett neu schreiben. Es könnte 
ja sein das der neue Name länger als der alte Name ist, damit würden 
beim direkten Schreiben in die Datei die nachfolgenden Daten verändert.

Nur für den Nachnamen kann das im Beispiel aber klappen wenn man das 
null_null Feld nicht braucht, da dann der Name ja das letzte (benutzte) 
Feld der Datei ist.

von Nitram E. (slexx)


Lesenswert?

Heiko G. schrieb:
> Du musst im allgemeinen die Textdatei komplett neu schreiben. Es könnte
> ja sein das der neue Name länger als der alte Name ist, damit würden
> beim direkten Schreiben in die Datei die nachfolgenden Daten verändert.
>
> Nur für den Nachnamen kann das im Beispiel aber klappen wenn man das
> null_null Feld nicht braucht, da dann der Name ja das letzte (benutzte)
> Feld der Datei ist.

OK danke, Genau so habe ich es auch gemacht :) Ich dachte nur es gibt 
noch einen anderen Weg.
Ich schreibe alle Sachen neu in die txt Datei aber jetzt stehe ich vor 
dem Problem dass er die alten Sachen nach unten versetzt, d.h. er fügt 
das neue ganz oben ein und das letzte rutscht nach unten. Das ist zwar 
nicht so schlimm aber auf Dauer füllt sich die Datei recht schnell.
Jetzt wollte ich es so machen dass er die Datei löscht -> eine neue 
Datei mit dem selben Name anlegt und dann die Werte rein schreibt.
Aber auch da weiß ich nicht wie das funktioniert, Ich kann keine 
keywords im Netz zur SDFat Lib finden.
Bei der normalen Lob geht das glaube ich mit SD. Remove() , aber der 
Befehl klappt bei der Fat Lib nicht. :(

von Heiko G. (heikog)


Lesenswert?

Sieh dir die Datei sdfat.h an welche Funktionen da deklariert sind. 
Normalerweise sollte es da ein remove() zum Löschen von Dateien geben. 
Es gibt aber wohl mehrere unterschiedliche SDFat-Bibliotheken, und ich 
selbst hab sie noch nicht benutzt.

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.