aus Datei bestimmte Zeile ausgeben
-
Hallo und herzlichen dank an alle die das lesen;
also ich möchte versuchen aus einer bestehenden Datei eine, aus dem zufallsprenzip gewählte, zeile ausgeben.
z.B.: die Datei enthällt verschiedene Sprüche (jeder spruch in einer neuen zeile gespeichert) und davon möchte ich einen zufälligen Spruch des Tages ausgeben.
jede zeile wird ja mit einem "\0" binärem Null und einem "\n" beendet. Den zufallsprinzip würde ich über die funktion rand() umsetzen die mir dann ein int-Datentyp zurück gibt und ich meine zufällige zeilennummer ausgewählt habe.
Und jetzt ist die frage wie kann ich in einer Datei nach der zeilen anzahl suchen und eine bestimmte zeile ausgeben??
MfG Vitas
-
Wenn die Zeilen eine feste breite haben, dann kannst du mit man: fseek(3) arbeiten. Ansonsten bleibt dir nichts über mit zB man: fgets(3) die N Zeilen auszulesen und danach an den Anfang der Datei zu springen.
jede zeile wird ja mit einem "\0" binärem Null und einem "\n" beendet.
Nein, normalerweise ist am Ende einer Zeile kein '\0'!
-
nein leider haben die zeilen keine feste breite,
und wenn man die datei, in dem selben programm erstellt und die sprüche selber zeilenweise eingibt??? könnte man vielleicht dann etwas verwenden, wie z.B.: zeiger oder arrays?
gäbe es da vielleicht eine möglichkeit?
hier einmal meine funktionen die ich schon mal fertig habe
char menu(){ // Menü char c2; int ianz; printf("Bitte ein Menuepunkt waehlen\n"); printf("a) Datei erstellen bzw. vorhandene Datei waehlen!\n"); printf("b) Spruch hinzufuegen!\n"); printf("c) Spruch des Tages eingeben!\n"); printf("d) Ende\n"); ianz=scanf("%c",&c2); return c2; } void dateineu(char *filen){ FILE *fp; //neue oder vorhandene datei nehmen char *c3=".txt"; printf("\nBitte Dateiname eingeben! max. 50 Zeichen\n"); gets(filen); if (0==strlen(filen)){ fp=fopen("file.txt","a+"); strcpy(filen,"file.txt"); } else { strcat(filen,c3); fp=fopen(filen,"a+"); } fclose(fp); } void spruchein(char *filen){ FILE *fp; //spruch eingabe in die datei char str[200],*c1="\n"; // zeilenumbruch printf("\nBitte geben Sie einen Spruch des Tages ein! max. 200 Zeichen!\n"); gets(str); fp=fopen(filen,"a+"); if (0!=strlen(str)){ strcat(str,c1); fputs(str,fp); // zeilenweise in datei speichern } fclose(fp); } void zufallspruch(char *filen){ FILE *fp; n=rand()%i; fp=fopen(filen,"a+"); }
-
Du könntest die gesamte Datei in ein String-Array einlesen und dort beliebig herumnavigieren, aber ob das etwas bringt, wenn du nur einen Spruch pro Tag ausgeben willst, ist die andere Frage. Die Alternative wäre es, an einer festen Position in der Datei die Startpunkte der Zeilen unterzubringen (z.B. am Datei-Anfang) - dann mußt du nur noch die Zielposition holen, dorthin springen und den Spruch auslesen.
-
@rüdiger mit fgets hat es prima geklappt musste ein wenig rumfummeln aber es funktioniert
hier die jeweilige funktion:
void ausgeben(FILE *fp,char *filen){ int i=0,izufall; char *cp1, ivekt[255]; cp1=ivekt; fp=fopen(filen,"r+"); rewind(fp); //dateizeiger auf die startposition stellen do{ i++; //variable zum zählen der schleifendurchgänge fgets(cp1, 200, fp); //sucht nach dem ersten \n und schreibt in cp1 //spruch darf nicht länger als 200 zeichen sein }while(feof(fp) == 0); //schleifenende wenn zeiger am ende der datei if (i==1) printf("Datei ist leer\n"); else{ printf("In Datei sind %d Sprueche\n", i-1); fp=fopen(filen,"r+"); rewind(fp); izufall=rand()%(i-1); //zufallszahl hätte man auch durch srand()- i=0; //realisieren können "ist besser" do{ fgets(cp1, 200, fp); //in dieser Schleife gibt er eine zufällige zeile aus if (i==izufall){ printf("%d-te Spruch lautet\n",izufall+1); puts(cp1); } i++; }while(i!=(izufall+1)); fclose(fp); } }
-
Sorry, wenn das nichts direkt mit dem Problem zu tun hat, aber:
Vitas schrieb:
zufallszahl hätte man auch durch srand()-realisieren können "ist besser"
Wer hat dir denn sowas erzählt? rand() und srand() arbeiten nicht gegeneinander, sondern miteinander - srand() initialisiert den Zufallsgenerator mit einem vorgegebenen Wert, rand() liefert bei jedem Aufruf eine neue Zufallszahl ausgehend von dieser Initialisierung.
-
trotzdem danke für deinen post,
ja wegen srand hast du recht.
aber man hätte die initialisierung über die zeit machen können <-- das hätte ich schreiben sollen.