Segmentation fault?
-
Bzw. Es kommt immernoch segmenation fault.
-
fscanf will einen Adresse auf eine Variable haben und nicht den Wert der Variablen.
while((fscanf(fp,"%c",&zwischen[i]))!= EOF)
Aber wie schon gesagt, ist fscanf an der Stelle Blödsinn.
-
while((fscanf(fp,"%c",&zwischen[i]))!= EOF)
zu
char ch; while((ch=fgetc(fp)!=EOF) ...
bessere lösung mit for:
int i; for ch; for(i=0;ch!=EOF;i++) { ch=fgetc(fp); zwischen[i]=ch; } zwischen[i]='\0'
hab ich jetzt nicht getestet, sollte aber gehen
-
edit:
es heißt natürlich "char ch" und NICHT "for ch"
-
edit 2 - sorry
bei "zwischen[i]='\0'" fehlt ein ';'
der verbesserte code mir for:
int i; char ch; for(i=0;ch!=EOF;i++) { ch=fgetc(fp); zwischen[i]=ch; } zwischen[i]='\0';
hoffe, dass es so stimmt
-
Okay ich mir in Zukunft merke danke^^
letzte Frage: wenn ich die Dateien danach oeffne, sind sie immer noch wie voher, woran lIegt das?#include<stdio.h> #include<string.h> int main() { char zwischen[1000]; int i = 0; FILE *fp; fp = fopen("hallo.txt", "rw"); if (fp == NULL) { printf("Die Datei konnte nicht geöffnet werden."); } else { while((fscanf(fp,"%c",zwischen[i]))!= EOF) { i++; } } zwischen[i+1] = '\0; printf("%s",zwischen); int len = strlen(zwischen); int j; for(j = 0; j< len; j++){ if (zwischen[j] == ' ') { if(zwischen[j+1] > 'a' && zwischen[j+1] < 'z') { zwischen[j+1] -= 32; } } } for(j=0;j<len;j++) { fprintf(fp,"%c",zwischen[j]); } fclose(fp); printf("%s", zwischen); }
Funktioniert alles der gcc meckert nicht rum. Aber die Datei verändert sich halt nicht..
-
was willst du eigentlich machen? den inhalt einer textdatei in einem array speichern?
-
Die option "rw" gibt es nicht bei fopen.
Entscheidend ist der erste Buchstabe. Bei dir r für read.Wenn du gleichzeitig lesen und schreiben willst, musst du die + Option mit dazunehmen.
Da musst du dich aber mit den Dateizeigern auseinander setzen.
s.a.ftell(), rewind(), fseek()...
-
"r" und "w" als Argument bei fopen sind UB (undefiniertes Verhalten), gleichzeitiges Lesen und Schreiben in derselben Datei solltest du dir als Anfänger nicht zumuten.
-
1234567890 schrieb:
char ch; while((ch=fgetc(fp)!=EOF) ...
Das ist absoluter Anfängerschrott; liebe Kinder, nicht nachmachen.
-
Wie sollen die Kinder es denn machen? Mit fgets und ohne Schleife à la DirkB oder ganz anders?
-
Schock schrieb:
Wie sollen die Kinder es denn machen?
Das ch als int definieren.
Deswegen macht man ja den Zwischenschritt mit der lokalen Variable ch und arbeiten nicht direkt mit zwischen[i].
-
Wutz schrieb:
1234567890 schrieb:
char ch; while((ch=fgetc(fp)!=EOF) ...
Das ist absoluter Anfängerschrott; liebe Kinder, nicht nachmachen.
ich schreibe im selben post, dass die lösung mit for besser ist.
-
Du hast nicht verstanden, wo der Fehler in deinem Beispiel liegt, und lesen, z.B. im vorigen Beitrag, scheinst du auch nicht zu können.
-
Wutz schrieb:
Du hast nicht verstanden, wo der Fehler in deinem Beispiel liegt, und lesen, z.B. im vorigen Beitrag, scheinst du auch nicht zu können.
und wo ist eigentlich dein vorschlag? mit dem finger auf andere zeigen aber selbst nichtmal eine vorschlag machen, das kann auch jeder.
-
Wenn ich das richtig lese, geht es dir darum, Kleinbuchstaben in einer Datei in Großbuchstaben umzuwandeln, richtig?
Generell ist es bei Dateihandling keine gute Idee, solche Umwandlungen in-place vorzunehmen. Wenn zum falschen Zeitpunkt etwas schiefgeht (etwa der Rechner abstürzt oder ein Stromausfall passiert), stehst du so mit korrupten Daten da. Besser wäre etwas in dieser Art:
#include <ctype.h> #include <stdio.h> #define FNAME "hallo.txt" #define FNAME_NEW FNAME ".new" int main() { char buf[256]; size_t r, i; FILE *in = fopen(FNAME, "r"); if(!in) { return -1; } FILE *out = fopen(FNAME_NEW, "w"); if(!out) { fclose(in); return -2; } while((r = fread(buf, 1, sizeof(buf), in)) != 0) { for(i = 0; i < r; ++i) { buf[i] = toupper(buf[i]); } fwrite(buf, 1, r, out); } fclose(out); fclose(in); return rename(FNAME_NEW, FNAME); }
-
So ähnlich mein Ziel war, jedes Wort was mit einen kleinbuchstaben anfängt in einen Großbuchstaben umzuwandeln.
Hatte #define
Und die andere Header Datei nicht, da ich grad dabei bin die Grundlagen zu lernen.
Hab's mir trotzdem angeguckt danke:)