Datei einlesen + (s)rand in C

Manda

Erfahrenes Mitglied
Hallo Leute,

hab mal wieder einige Fragen (sind "nur" 2), wo ich wieder mal nicht weiter komme...
Ich versuche eine Datei einzulesen. Das klappt auch. Er fragt nach dem Pfad ab, öffnet die Datei, z.B: Pfad: c:\Temp\Textdatei.txt dort stehen 2 Wörter drin
Wort1
Ende
Die kann ich auch ausgeben. Allerdings versuch ich diese in ein Array zu speichern und anschließend nochmals ausgeben zu können. Da kommen leider nur irgendwelche Zeichen raus.
Hier der Code:
Code:
#include <stdio.h>
#include <stdlib.h>

void read_char(FILE *stream);
void ausgabe(char *array);

int main(int argc, char **argv)
{
	FILE *datei;
	char filename[255];

	if(argc < 2)
	{
		printf("Welche Datei wollen sie \231ffnen: ");
		scanf("%s", &filename);
		datei = fopen(filename, "r");

		if(datei != NULL)
		{
			read_char(datei);
		}
		else
		{
			printf("Datei nicht gefunden!");
			return EXIT_FAILURE;
		}
	}
	else
	{
		datei = fopen(argv[1], "r");
		
		if(datei != NULL)
		{
			read_char(datei);
		}
		else
		{
			printf("Konnte %s nicht \231ffnen", argv[1]);
			return EXIT_FAILURE;
		}
	}

	printf("\n\n");
	return 0;
}

void read_char(FILE *stream)
{
	int c = 0;	
	char array[50];

	while( ( c = fgetc(stream)) != EOF)
	{
		putchar(array[ c] = c);
	}	
	printf("\n");
	ausgabe(array);
}

void ausgabe(char *array)
{
	int i = 0;

	while(array[i] != EOF)
	{
		putchar(array[i]);
		i++;
	}
}

Die Ausgabe machts leider nicht :( hat jemand eine ide

2. Frage wäre, wenn ich NUR ein Wort ausgeben will, also per Zufall, wie könnte ich das hin kriegen? Ich versuche schon die ganze Zeit rand() einzubauen, aber funktioniert nicht.
Die Textdatei bekommt noch weitere Wörter, hier sind nur 2 zum testen.
Ich hoffe ihr könnt mir helfen!!

Dank im Vorraus

MfG
Manda
 
Hi.

Da du ja vorher nicht wissen kannst, wieviel Wörter in der Datei stehen, ist ein Array immer relativ schlecht geeignet, da es sich nicht dynamisch erweiteren läßt. Da wäre es evlt. besser eine Liste als Datenstruktur zu verwenden.

Zu Übungszwecken könntest du dich natürlich auch erstemal auf ein Maximum von n Worten beschränken.

Wenn du Worte einlesen willst, warum verwendest du nicht fscanf, oder liest die Datei gleich zeilenweise mit fgets ein? Wenn du zufällig ein Wort ausgeben willst, mußt du die Worte doch sowieso trennen.

Um Worte in einem Array zu speichern benötigst du ein 2-dimensionales Array:
C:
char wort[20][50]; // max 20 Worte mit max. 49 Buchstaben!
Dann müßtest du nur die Worte in einer Schleife einlesen und in dem Array speichern: das erste Wort in der Datei in wort[0], das zweite in wort[1] usw.

Gruß

PS: Die Benennung der Funktion ist nicht ganz glücklich. Die read_char Funktion macht viel mehr als nur ein Zeichen zu lesen (was ihr Name implizieren würde), und warum ruft die Funktion read_char die Funktion ausgabe auf?
 
Zuletzt bearbeitet:
Hi,

danke für die Antwort!! Eigentlich kann ich selbst entscheiden wieviele Wörter ich in dieser Liste habe. Zum lernen erstmal 10.
Hast du vielleicht ein bsp mit fgets und fputs Ich versuche das zwar in mein Code einzubauen, aber irgendwie bekomme ich da nur mehr fehler rein :s

DIe Funktion ausgabe(char *array) wollte ich nur so starten, um das array woanders ausgeben zu können. Aber da kommen leider nur komische Zeichen raus.

Vielleicht ein Tip für mich

MfG
Manda
 
Hi,

hab folgendes jetzt geändert (vom Buch "C von A-Z").
Code:
#include <stdio.h>
#include <stdlib.h>

#define ZEILENLAENGE 80

int main(int argc, char **argv)
{
	FILE *datei;
   char puffer[ZEILENLAENGE];
	char filename[50];

   printf("Bitte Pfad angeben: ");
   scanf("%s", filename);
   
	if( (datei = fopen(filename,"r")) == NULL) 
	{
      fprintf(stderr, "\n\nFEHLER:\n!! %s !!\nKann nicht g\231ffnet werden\n", filename);
      return EXIT_FAILURE;
   }
   
	while(fgets(puffer, ZEILENLAENGE, datei))
   {
		fputs(puffer, stdout);
	}   
	
	printf("\n\n");
	return 0;
}
Nur das mit den abspeichern der Wörter im array[20][50] ist mir noch unklar, wie ich das mit einer Schleife machen könnte.
Könntest mir da auf die Sprünge helfen Bin (noch) nicht so fit in C, aber ich bemüh mich!! lol
Danke dir schonmal!!

MfG
Manda
 
HI,

hat keiner eine Idee Stecke da echt fest, kann die Wörter nicht in Array speichern. Wenn, dann speichert er nur das letzte :confused:
hat an "strcpy" gedacht, aber so bekomme ich leider nicht alle Wörter gespeichert.
Irgendwelche Vorschläge

MfG
Manda
 
Hi.

C:
const int max_worte = 20;

char wort[max_worte][ZEILENLAENGE];

int nr = 0;

// Worte einlesen:
while(nr <  max_worte && fgets(wort[nr], ZEILENLAENGE, datei)) {
  ++nr;
}

// Worte ausgeben:
for (int i = 0; i < nr; ++i) {
  fputs(wort[i], stdout);
}
Gruß
 
Zuletzt bearbeitet:
Hi,
Danke für deine Hilfe. Aber es läuft immer noch nicht. Er gibt mir immer 3 Fehler aus.
Hier der Code (momentan):
C:
#define ZEILENLAENGE 100

int main(int argc, char **argv)
{
   char puffer[ZEILENLAENGE];
	char filename[100];
	const int max_worte = 20;
	char wort[max_worte][ZEILENLAENGE]; 
	int nr = 0;
	int i = 0;
	FILE *datei;
	
	printf("Bitte Pfad angeben: ");
   scanf("%s", filename);
  
	printf("\n");
	if( (datei = fopen(filename,"r")) == NULL) 
	{
      fprintf(stderr, "\n\nFEHLER:\n!! %s !!\nKann nicht g\231ffnet werden\n", filename);
      return EXIT_FAILURE;
   }
   
	// Worte einlesen:
	while(nr <  max_worte && fgets(wort[nr], ZEILENLAENGE, datei)) 
	{  
		++nr;
	}

	// Worte ausgeben:
	for(i = 0; i<nr; ++i) 
	{  
		fputs(wort[nr], stdout);
	}

	printf("\n\n");
	return 0;
}

bei der Deklaration der Variable: char wort[max_worte][ZEILENLAENGE];
sagt er: Konstanter Ausdruck erwartet
Wenn ich aber "max_worte" als define deklariere, dann läuft das Programm, ABER er zeigt irgendwelche komische Zeichen an und keine Worte mehr lol.

So langsam blick ich garnich mehr durch. Mach ich was falsch

MfG
Manda
 
bei der Deklaration der Variable: char wort[max_worte][ZEILENLAENGE];
sagt er: Konstanter Ausdruck erwartet
Was für einen Compiler verwendest du denn? Scheint etwas veraltet zu sein der gute.
Wenn ich aber "max_worte" als define deklariere, dann läuft das Programm
Ja, dann nimm #define, aber üblicherweise schreibt man diese Präprozessorvariablen dann groß.
, ABER er zeigt irgendwelche komische Zeichen an und keine Worte mehr lol.
Ja, das war ein Copy'n'paste Fehler meinerseits. Hab's in meinem letzten Post verbessert...

Gruß
 
Hi,

verwende: Visual Studio 6.0 (ist ziemlich alt ich weis) aber wir benutzen halt den und darum wollt ich es auch da zum laufen kriegen.
Liegts am Compiler

Als #define hab ich es natürlich groß geschrieben. Aber geht trotzdem nicht.
Und warum er irgendwelche zeichen anzeigt, anstatt die Wörter, weis ich immer noch nicht :confused

hier noch mal die Fehler:
1. Konstanter Ausdruck erwartet
2. Reservierung eines Feldes der konstanten Groesse 0 nicht moeglich
3. 'wort': unbekannte Groesse
Vielleicht noch eine andere Variante

MfG
Manda
 

Neue Beiträge

Zurück