# Lesen und schreiben in File



## Bobi (5. Feb 2019)

Guten Abend, 

Ich habe folgendes Problem zu lösen. 

*Teil 1*
Schreibe eine Funktion, welche eine Datei öffnet und deren Text wie folgt ändert. Fängt ein Wort mit einem Kleinbuchstaben an, so soll ein Großbuchstabe daraus gemacht werden.  Beispiel: aus „Die schönen Dinge im Leben sind umsonst.“ wird „Die Schönen Dinge Im Leben Sind Umsonst.“. Im Parameter wird lediglich der Dateipfad übergeben.

Meine Code ist folgendes aber es funktioniert nicht. 

```
#include<stdio.h>

int main(){

   FILE *fp;
   int temp, count = 0;   
   
   fp = fopen("Schreiben.txt", "rw");
   
   if(fp == NULL){
      printf("Datei könnte nicht geoeffnet werden\n");      
   }else{
       while((temp = fgetc(fp)) != EOF){
           
           if(count == 1){
               
               if('a' >= temp && temp <= 'z'){
                   temp = temp - 32; 
                   fputc(temp, fp);
               }
           }
           
           if(count == 1){
               count = 0; 
           }
           
           if(temp == ' '){
               count = 1; 
           } 
       }
       fclose(fp);
   }
  return 0; 
}
```

Wo ist mein Fehler?


----------



## krgewb (5. Feb 2019)

```
if('a' >= temp && temp <= 'z'){
```

Du meinst

```
if(temp >= 'a' && temp <= 'z'){
```


----------



## Bobi (5. Feb 2019)

krgewb hat gesagt.:


> ```
> if('a' >= temp && temp <= 'z'){
> ```
> 
> ...



hat trotzdem keine Auswirkung.


```
if('a' >= temp && temp <= 'z'){
```
Ich habe es so geschrieben, weil was in temp Variable stand muss zwischen  a und z sein.
Wenn es große Buchstabe wäre brauchte nicht zu überprüfen.


----------



## mrBrown (5. Feb 2019)

Bobi hat gesagt.:


> ```
> if('a' >= temp && temp <= 'z'){
> ```
> Ich habe es so geschrieben, weil was in temp Variable stand muss zwischen  a und z sein.
> Wenn es große Buchstabe wäre brauchte nicht zu überprüfen.



Aktuell prüft das aber, dass temp *kleiner oder gleich* als 'a' und kleiner als 'z' ist.


----------



## Bobi (5. Feb 2019)

Ja ja sorry habt ihr recht. Die Überprüfung war falsch. aber 
das Gewünschte Ergebnis  bekomme ich trotzdem nicht


----------



## mihe7 (5. Feb 2019)

```
#include<stdio.h>

int main(){

   FILE *fp;
   int temp, count = 0;

   fp = fopen("Schreiben.txt", "r+"); // lesen und schreiben

   if(fp == NULL){
      printf("Datei könnte nicht geoeffnet werden\n");
   }else{
       while((temp = fgetc(fp)) != EOF){
           if(count == 1){

               if(temp >= 'a' && temp <= 'z'){
                   temp = temp - 32;
                   fseek(fp, -1L, SEEK_CUR); // zum vorherigen Zeichen zurück
                   fputc(temp, fp);
               }
           }

           if(count == 1){
               count = 0;
           }

           if(temp == ' '){
               count = 1;
           }
       }
       fclose(fp);
   }
  return 0;
}
```


----------



## Bobi (5. Feb 2019)

Leider funktioniert nicht das Programm geriet in Unendlichkeit. Ich kann es dann schwer Stoppen.
Im File wird nur das geschrieben "Die Sie Sie Sie Sie Sie Sie Sie Sie Sie Sie Sie Sie Sie Sie Sie Sie Sie Sie Sie Sie Sie Sie Sie Sie Sie Sie Sie Sie Sie Sie Sie ..............  " 

Ich glaube das wird von dieser Teil verursacht "r+"

statt Plus miss eine von den diese Zeichen stehen.
*r*, read, lesen
*w*, write, schreiben
*a*, append, anhängen
*b*, binary, Binärmodus
*t*, text, Textmodus


----------



## mihe7 (5. Feb 2019)

Bobi hat gesagt.:


> Ich glaube das wird von dieser Teil verursacht "r+"


Das glaube ich nicht. Es wird ja offensichtlich geschrieben. Die Modi: http://openbook.rheinwerk-verlag.de/c_von_a_bis_z/016_c_ein_ausgabe_funktionen_005.htm

Hast Du auch das fseek übernommen?


----------



## Bobi (5. Feb 2019)

mihe7 hat gesagt.:


> Das glaube ich nicht. Es wird ja offensichtlich geschrieben. Die Modi: http://openbook.rheinwerk-verlag.de/c_von_a_bis_z/016_c_ein_ausgabe_funktionen_005.htm
> 
> Hast Du auch das fseek übernommen?



Ja, ich habe alles übernommen.  Ok ich versuche jetzt mit Visualstudio


----------



## mihe7 (5. Feb 2019)

Bobi hat gesagt.:


> Ok ich versuche jetzt mit Visualstudio


Womit hast Du es denn versucht gehabt?


----------



## krgewb (5. Feb 2019)

"r+" ist r und w in einem.


----------



## Bobi (6. Feb 2019)

mihe7 hat gesagt.:


> Womit hast Du es denn versucht gehabt?


Mit Notepad++ . Meine Lizense ist abgelaufen für Visualstudio


----------



## mihe7 (6. Feb 2019)

Bobi hat gesagt.:


> Mit Notepad++


Womit Du das Programm übersetzt hast, meine ich  Welcher Compiler? Welche Optionen?



krgewb hat gesagt.:


> "r+" ist r und w in einem.


Nein. Ein w würde die Dateilänge auf 0 setzen. Die Kombination rw gibt es nicht. Ein "r+" öffnet eine bestehende Datei zwecks Aktualisierung.


----------



## Bobi (6. Feb 2019)

mihe7 hat gesagt.:


> Womit Du das Programm übersetzt hast, meine ich  Welcher Compiler? Welche Optionen?



Ich habe gcc falls du das meinst. Ich führe meine Code so aus  gcc name.c -Wall -o name
Oder meinst du was anderes?


----------



## httpdigest (6. Feb 2019)

Bobi hat gesagt.:


> Meine Lizense ist abgelaufen für Visualstudio


Was hast du denn für eine Visual Studio Version? Bei der für nicht-commerzielle Projekte - zu welchem ich deine Aufgabe mal zähle - freie Community Edition - z.B. Visual Studio 2017 Community läuft nix ab. Die kann alles, was du brauchst.


----------



## mihe7 (6. Feb 2019)

Bobi hat gesagt.:


> Oder meinst du was anderes?


Nein, das meinte ich. Mit gcc sollte der Code funktionieren.


----------



## Bobi (6. Feb 2019)

httpdigest hat gesagt.:


> Was hast du denn für eine Visual Studio Version? Bei der für nicht-commerzielle Projekte - zu welchem ich deine Aufgabe mal zähle - freie Community Edition - z.B. Visual Studio 2017 Community läuft nix ab. Die kann alles, was du brauchst.



Ich habe 2015 Version. ich werde jetzt löschen und neue installieren.


----------



## mihe7 (6. Feb 2019)

Hm... Eventuell fehlt hier zur Portabilität noch ein `fseek(fp, 0L, SEEK_CUR);` nach dem fputc. Der Standard "verlangt", dass beim Wechsel von Aus- zur Eingabe eine Positionierungsfunktion aufgerufen wird.


----------



## Bobi (6. Feb 2019)

mihe7 hat gesagt.:


> Hm... Eventuell fehlt hier zur Portabilität noch ein `fseek(fp, 0L, SEEK_CUR);` nach dem fputc. Der Standard "verlangt", dass beim Wechsel von Aus- zur Eingabe eine Positionierungsfunktion aufgerufen wird.



It works huhu 

```
fseek(fp, 0L, SEEK_CUR);
```
 das war entschiedenste Teil
Danke an allen für eure  Geduld und Hilfe.


----------

