# File read/write + string operationen



## Thomasio (23. Dezember 2007)

Einfaches read und write habe ich inzwischen gelernt, aber nun steigert sich das Ganze eine Stufe und ich steh wieder da wie die Kuh vorm Berg

Ich habe eine Datei angelegt, die einen string enthält, der durch ein Zeichen getrennt Substrings enthält, die wiederum durch ein anderes Zeichen getrennt Sub-Substrings enthalten

z.B. so:

23'blabla'irgendwas!456'mehrblabla'sonstwas'text'text'text!

Substrings durch Rufzeichen getrennt, Sub-Substrings durch Hochkomma
Dieses File lese ich zu Beginn meiner Anwendung ein, es wird unterwegs verändert, und soll am Ende zurück geschrieben werden

Erstes Problem dabei ist, dass mehrere Anwendungen auf diese Datei zugreifen, lesen und schreiben, ich muss also

1) Beim Erstellen dem File passende Attribute geben, so dass alle Anwendungen Schreib-/Leseberechtigung darauf haben
2) Beim Schreiben den Zugriff für andere Anwendungen sperren
3) Wenn 2 Anwendungen gleichzeitig zugreifen, muss die Zweite warten bis die Erste fertig ist

Ohne mehrfach Zugriff war es bisher so:


```
HANDLE hFile;
DWORD dwWritten;
hFile = CreateFile("filename.txt", GENERIC_WRITE, 0, NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL);
if(hFile2 != INVALID_HANDLE_VALUE)
  {
      WriteFile(hFile,wasauchimmer,wasauchimmer.length(), &dwWritten, NULL);
  }
CloseHandle(hFile);
```

Was muss ich daran ändern, damit die 3 zusätzlichen Bedingungen erfüllt werden?
Bei MSDN habe ich unter CreateFile ein paar Infos gefunden aber ganz schlau geworden bin ich daraus nicht, vermutlich könnte ich es mit Trial&Error hin bekommen, einen Sleep() einbauen falls gesperrt usw
Aber am Ende würde ich lieber verstehen warum es funktioniert als einen Code zu kopieren von dem ich nicht weiss was der macht

Zweites Problem, ich muss vorm (oder beim) Schreiben zuerst nochmal lesen, Änderungen vergleichen und abhängig davon was sich verändert hat, Teile nicht schreiben, mit Änderungen schreiben, oder neu dazu schreiben

Dazu enthält jeder Substring im ersten Sub-Substring eine Zahl, quasi als Index, anhand der ich vergleichen kann

Ich habe dazu bisher nur ein wahnwitzig abenteuerliches Gebilde von Code, das funktioniert zwar, aber das traue ich mich gar nicht posten, sonst schreibt mir vor lauter lachen niemand mehr eine Antwort
Hier nur die Kurzform:


```
char mystring[] = updated_String_from_Memory;
char buffer[] = ReadFile(...);
int stringcounter = 0;
int buffercounter = 0;

char* TeilString;
TeilString = strtok(mystring, "!");
while(TeilString != NULL)
{
   stringcounter = 0;
   char* SubTeilString;
   SubTeilString = strtok(Teilstring, "'");
   while(SubTeilString != NULL)
   {
      stringcounter++;
      char* TeilBuffer;
      TeilBuffer = strtok(buffer, "!");
      while(TeilBuffer != NULL)
      {
         buffercounter = 0;
         char* SubTeilBuffer;
         SubTeilBuffer = strtok(TeilBuffer, "'");
         while(SubTeilBuffer != NULL)
         {
            buffercounter++;


// hier kann ich anhand stringcounter und buffercounter
// Vergleiche anstellen und nach Bedingungen ins File schreiben


         }
      }
   }

}
```

Natürlich fehlt da noch 4fach das untere Ende vom strtok, das habe ich mal weggelassen wegen der Übersicht
Ich vermute, dass man mit stringstream und vector hier viel einfacher zum Ziel kommen könnte, nur bringe ich das nicht auf die Reihe
Mir schwebt da was vor von 3dimensionales array von stringstreams, aber da wirds mir beim Gedanken daran schon schwindelig

Was ich gerne hätte ist nicht unbedingt ein fertiger Code zum kopieren (das Ganze ist eh nur ein Übungsbeispiel zum lernen), sondern eine Erklärung, was da wie und warum mit stringstream und vector gemacht werden kann

Gefunden habe ich in Google ein paar Seiten, die zwar die Grundlagen von stringstream und vector erklären, aber die werden spätestens im dritten Satz chinesisch, bzw. ich komme nicht mehr mit was die da von mir wollen, zu verschachtelten streams bin ich gar nicht vorgedrungen


----------



## Ryu1991 (26. Dezember 2007)

Also von Streams habe ich ehrlich gesagt keine Ahnung, aber die am Anfang aufgelisteten 3 Punkte lassen sich problem los mit fopen() lösen, schaus dir mal an


----------

