Datei einlesen
-
Hallo!
Habe hier folgendes Problem: Ich möchte eine Textdatei einlesen, zuerst werden die Wörter davon gezählt (funktioniert) und anschließend möchte ich beispielsweise das 6. Wort lesen - funktioniert jedoch nicht.
Wo liegt da mein Fehler?#include <stdio.h> #include <stdlib.h> int zaehlen(FILE *datei); char wort(FILE *datei, int zahl); FILE *datei; int main() { datei=fopen("gedicht.txt", "r"); printf("Der Text enthaelt %d Woerter.\n", zaehlen(datei)); printf("Das 6. Wort des Textes lautet: %s\n", wort(datei, 5)); system("PAUSE"); } char wort(FILE *datei, int zahl) { int i=0; char zeiger[100][200]; while (!feof(datei)) { fscanf(datei, "%s", &zeiger[i]); i++; } return zeiger[zahl]; } int zaehlen(FILE *datei) { int i=0; char text[200]; while (!feof(datei)) { fscanf(datei, "%s", &text); i++; } return i; }
-
Definiere "funktioniert nicht".
Ich hab den Code jetzt nur überflogen und der Fehler liegt wohl daran, dass eine Funktion (zaehlen) schon bis EOF durchscannt und daher die zweite Funktion nichts einlesen kann, weil eben das Ende der Datei erreicht ist. Versuch mal "fseek(file, 0, SEEK_SET); vor "while (!feof(datei))" in der Fkt word. Keine AHnung, obs da noch nen anderen Befehl gibt, um an den Anfang der Datei zu kommen.
€dit: Nen Stream zu schliessen sollte selbstverständlich sein -> fclose benutzen.
€dit2: Anstatt fseek sollte man "rewind(file);" nehmen obwohl ..
The rewind function repositions the file pointer associated with stream to the beginning of the file. A call to rewind is similar to
(void) fseek( stream, 0L, SEEK_SET );
-
Feigling hat recht. Da ich nichts zu tun habe hier das funktionierende Programm: (ps globale Variablen vermeiden ;))
#include <stdio.h> #include <stdlib.h> int CountWords(char* filename); int GetWord(char* filename, char* word, int whichWord); int main(int argc, char* argv[]) { char word[100]; printf("Der Text enthaelt %d Woerter.\n", CountWords("gedicht.txt")); GetWord("gedicht.txt",word, 5); printf("Das 6. Wort des Textes lautet: %s\n", word); system("PAUSE"); } /* returns number of words */ int CountWords(char* filename) { FILE* file = NULL; char Word[100]; /* one word max 100 chars long */ int numWords = 0; file=fopen(filename, "r"); if(file) { while (!feof(file)){ fscanf(file, "%s", &Word); numWords++; } fclose(file); } return numWords; } /* returns 1 if successful otherwise 0 */ int GetWord(char* filename, char* word, int whichWord) { FILE* file = NULL; int i = 0; file = fopen(filename,"r"); if(file) { while(!feof(file)) { fscanf(file, "%s", word); i++; if (i == whichWord) { return 1; } } fclose(file); } return 0; }
-
Das Programm funktioniert soweit und ich habe es auch in der Form verstanden, danke! Aber jetzt wollte ich das doch nochmal mit einem Zeiger probieren und nun stehe ich wieder auf dem Schlauch.
Habe es zuerst ohne Funktion geschrieben und das funktioniert einwandfrei.
#include <stdio.h> #include <stdlib.h> int main() { char *wort[200][200]; int i=0; FILE* fp; fp=fopen("gedicht.txt", "r"); while(!feof(fp)) { fscanf(fp, "%s", &wort[i]); i++; } printf("Das Wort lautet: '%s'\n", wort[5-1]); system("PAUSE"); return 0; }
Dann wollte ich dieses in eine Funktion mit reinpacken und nun funktioniert es doch wieder nicht, "return makes integer from pointer without a cast" (??).
Da fehlt mir dann wohl doch noch die Erfahrung.#include <stdio.h> #include <stdlib.h> char wort(char* filename, int nummer); int main() { printf("Das Wort lautet: '%s'\n", wort("gedicht.txt", 5)); system("PAUSE"); return 0; } char wort(char* filename, int nummer) { FILE *fp; fp=fopen(filename, "r"); char *zeiger[200][200]; int i=0; while(!feof(fp)) { fscanf(fp, "%s", &zeiger[i]); i++; } return zeiger[nummer-1]; }
Wäre super, wenn ihr mir nochmal helfen könntet und die Abänderung von dem Programm verraten würdet
-
Danke, hat sich jetzt doch erledigt! War wohl nur ein "*" vor "Wort"...
-
ähmmmmmmm....
zufall dass es geht:
der speicher für das array "zeiger" wurde nicht mit malloc angelegt. Es sollte daher der Speicher nach aufruf der Funktion freigegeben werden, was unter bestimmten Umständen dazu führt, dass die anschliessende Ausgabe nicht funktioniert.WO IST DAS FCLOSE?!?!?!?!
und schon mal was von "fgets" gehört?mfG (c)h
-
Ok, wenn ich aber malloc verwende, funktioniert das nicht auf Anhieb, habe jetzt mal ein kleines Prog zum Üben geschrieben, aber irgendwie will das nicht den Zeiger[1] anzeigen(???).
#include <stdio.h> #include <stdlib.h> int main() { char* zeiger; zeiger=(char*)malloc(sizeof(char)*3); zeiger[0]="abcd"; zeiger[1]="efghi"; zeiger[2]="jklmnopqr"; printf("%s\n", zeiger[1]); system("PAUSE"); return 0; }
-
Neuling00 schrieb:
Ok, wenn ich aber malloc verwende, funktioniert das nicht auf Anhieb, habe jetzt mal ein kleines Prog zum Üben geschrieben, aber irgendwie will das nicht den Zeiger[1] anzeigen(???).
#include <stdio.h> #include <stdlib.h> int main() { char* zeiger; zeiger=(char*)malloc(sizeof(char)*3); zeiger[0]="abcd"; zeiger[1]="efghi"; zeiger[2]="jklmnopqr"; printf("%s\n", zeiger[1]); system("PAUSE"); return 0; }
char zeiger ist ein eindimensionales array, wenn d es mit "zeiger[1]" ansprichst, sprichst du ein einzelnes char an.
du versuchst nun auf ein "char" ein "char[5]" zu speichern, was nicht funktionieren kann, weil das "char" nur 3 Elemente beeinhaltet "malloc(3)".
weiters kann man nicht einfach einen String mit
str1="hallo";
belegen, sondern man muss "strcpy" verwenden. Dh:
strcpy(zeiger,"asdf");
malloc.h fehlt
mein vorschlag:#include <stdio.h> #include <stdlib.h> #include <malloc.h> #include <string.h> int main() { char* zeiger; zeiger=(char*)malloc(8); // sizeof(char) = 1, 8 weil maximal 8 byte benötigt werden strcpy(zeiger,"abcd"); strcpy(zeiger,"efghi"); strcpy(zeiger,"jklmnop"); // belegung nur mit strcpy, größe 7 zeichen + \0 = 8byte --> malloc(8); printf("%s\n", zeiger); // ohne index, weil 1-dim free(zeiger); // free nicht vergessen! speicher wird freigegeben getch(); // bzw. getchar ,vergleichbar mit system("pause"); return 0; }
mfG (c)h
-
...wenn ich das Programm jetzt so laufen lasse, dann funktioniert es, zeigt jedoch nur "jklmnop" an, also quasi den letzten Eintrag bzw. den "letzten Zeiger". Was aber, wenn ich jetzt auf den ersten oder den zweiten zugreifen möchte (weil ich ja keinen Index angeben darf)?
-
dann musst du ein array deklarieren:
char *(zeiger[3]); // 3 pointer auf char zeiger[0]=(char*)malloc(5); // allocieren zeiger[1]=(char*)malloc(6); zeiger[2]=(char*)malloc(5); strcpy(zeiger[0],"asdf"); // belegen strcpy(zeiger[1],"hallo"); strcpy(zeiger[2],"test"); printf("\n%s",zeiger[0]); // ausgeben printf("\n%s",zeiger[1]); printf("\n%s",zeiger[2]);
-
und..
free(zeiger[0]); free(zeiger[1]); free(zeiger[2]);
nicht vergessen
-
Super, danke!!! Jetzt hab ichs glaub verstanden!
Werd ich gleich mal ausprobieren.
-
@Neuling
Bitte verwende nicht system("PAUSE"), das ist die aller schlechteste Methode, um eine beliebige Eingabe vom Benutzer zu verlangen. chille07 hat in seinem Code schon gezeigt, wie man es besser machen kann (-> getch()). Ansonsten gibts zu dem Thema noch einen Thread in der Konsolen-FAQ unter "Automatisches Schließen verhindern".