# dev-c++ Textdatei Einlesen, Zeichenanzahl zählen



## froxy (12. Mai 2005)

Hallo!
Könnte mir bitte jemand helfen die folgenden Aufgaben in dev-c++ zu lösen?
Ich muss ein Programm schreiben und kenne mich leider nicht aus...
- Einlesen einer Textdatei und Zeichenanzahl zählen
- Anzahl der Wörter im Text zählen
- Häufigkeit der Buchstaben von A bis Z (bzw. a bis z) im Text bestimmen
- Häufigkeit der einzelnen Wörter im Text bestimmt

Ich hoffe jemand kann mir helfen,
Liebe Grüße


----------



## Tobias K. (12. Mai 2005)

moin


Ich gehe mal davon aus das du das Programm in Stadart C++ schreiben willst.

Also erstmal die Datei komplett in ein Array einlesen, und das Zeichenweise, dann hast du die Datei in nem bequemen Array und musst nciht mehr mit der Datei rumhandtieren.
Direkt beim einlesen kannst du dann schon die Anzahl der Zeichen bestimmen (entspricht ja dann der Größe des Arrays) und du kannst die Anzahl der Wörter bestimmen in dem du die Leerzeichen zählst.

Für die dritte Aufgabe erstellst du eine Schleife, welche erst das Array nach 'a' durchsucht und zählt, dann nach 'b' sucht und immer so weiter.

Wie man die Häufigkeit der einzelnen Wörter bestimmt kann ich dir so jetzt nciht sagen.


mfg
umbrasaxum


----------



## jokey2 (12. Mai 2005)

Ich will Dir ja nicht die Freude am Lenen nehmen ;-), daher erstmal nur ein paar Tipps:
1. Dateien öffnen: schau Dir mal die stream-Klassen an, für Deinen Zweck speziell istream, wenn Du C++ programmierst. Für C gibt es die Funktion open(...), die Dir ein Filehandle zurückgibt, das Du beim Lesen mit der Funktion read(...) angibst. Die Anzahl der zeichen in einer Textdatei ist gleich der Größe der Datei (natürlich incl. Leerzeichen, Tabs usw.).
2. Wörter zählen: Vorne anfangen, Wortzähler = 0, Zeichen für Zeichen einlesen. Beim ersten Zeichen den Wortzähler um 1 erhöhen, ein Flag setzen, daß das wort schon gezählt ist, Zeichen für Zeichen weiterlesen, wenn das gelesene Zeichen ein Leerzeichen oder ein Tab ist, das Flag zurücksetzen und beim nächsten Buchstaben wieder Wortzähler um 1 erhöhen und Flag setzen.
3. Häufigkeit der Buchstaben: Du erstellst ein int-Array mir 256 Elementen und initialisierts es mit 0. Dann leist Du die Datei Zeichen für Zeichen. Da jedes Zeichen durch seinen ASCII-Wert repräsentiert wird, kannst Du mit 'intarray[zeichen]++' das entsprechende Arrayelement hochzählen. Am Ende stehen im Array die Anzahlen aller möglichen Zeichen.
4. Häufigkeit der Wörter: Das ist schon etwas aufwändiger, ich würde das mit einer sogenannten 'Map' machen, das ist eine Liste von Wertepaaren. Das erforderliche wertepaar wäre hier ein 'string' für das Wort und ein 'int' für die Anzahl. Du erstellst ein struct (oder eine Klasse) mit den 2 Members, dann eine Liste dieser structs. Wenn Du ein Wort eingelesen hast, schaust Du nach, ob es schon in der Liste ist. Wenn nein, dann legst Du ein Neues Listenelement an, mit dem Wort im string-Member und er Anzahl 1. Wenn ja, dann erhöhst Du den Zähler des Listenelementes um 1.

Was jetzt die konkrete Implementierung angeht, hängt das stark davon ab, ob Du in C oder C++ programmierst, wie man schon im Punkt 1 sieht. So, jetzt viel Spaß beim Programmieren, wenn was nicht klappt, erst suchen und probieren, wenn Du es dann immer noch nicht hinkriegst, wieder fragen.


----------



## froxy (12. Mai 2005)

Danke für deine Hilfe!

Die erste Aufgabe hab' ich jetzt geschafft (Text einlesen und Zeichen zählen).
Beim Wörterzählen hab' ich allerdings noch Probleme.
Ich habe folgendes eigegeben:

```
#include <stdio.h>
#include <stdlib.h>
main()
{

/* Einlesen einer Textdatei und Ausgabe auf dem Bildschirm */     
FILE *fil;
char zeichen;
int wortanzahl;
char wortliste[1000][50];
int BSAnzahl[100];
int wort,buchstabe;
int i,j,b;

wortanzahl = 1;

fil = fopen("test.txt", "r");
if(fil == NULL){
printf("\nDatei test.txt kann nicht geoeffnet werden\n");
exit(-1);
}

printf("Dateiinhalt:\n\n");

while(!feof(fil)){
fscanf(fil, "%c", &zeichen);


if(!feof(fil)){
               printf("%c", zeichen);
               if ((zeichen == 32)||(zeichen == 10)) {
                            wort++;
                            buchstabe = 0;
                            wortanzahl++;
                            }
               if (!((zeichen == 32)||(zeichen == 10))) {
                              wortliste[wort][buchstabe] = zeichen;
                              buchstabe++;
                              }
                  
}
}
fclose(fil);

printf("\n\n");

for (i=0;i<=wort;i++) {
    printf("\nWort %i : ",i);
    for (j=0;j<=49;j++) {
        printf("%c",wortliste[i][j]);
        }        
}

printf("\n\nWortanzahl : %i",wortanzahl);

printf("\n\n");

system("pause");
}
```


Mein Problem ist, dass das Programm damit jedes einzelne Wort einzeigt, z.B:
Wort 1: Der 
Wort 2: PC
Wort 3:......
Dabei möchte ich eigentlich nur dass der Text angezeigt wird und unten drunter die Wortanzahl steht (z.B: Wortanzahl: 100).

Könntest du mir bitte bitte nochmal helfen?
LG


----------



## Tobias K. (12. Mai 2005)

moin


Wozu machst du:

```
while(!feof(fil)){
fscanf(fil, "%c", &zeichen);
```

Und mit dem Wörter zählen hatte ich das doch schon oben beschrieben, das du einfach beim einlesen die Anzahl der Leerzeichen zählen kannst.


mfg
umbrasaxum


----------



## Tobias K. (12. Mai 2005)

moin


Ich hab es jetzt mal umgesetzt, wie ich es oben beschrieben hatte:

```
#include <stdio.h>


int main()
{
    char inhalt[1000];
    int zeichen=0;
    int worte=0;
    int anz_buchstaben[26];

    FILE *datei;
    datei = fopen("test.txt", "r");
	
    while(!feof(datei))
    {
    	inhalt[zeichen] = fgetc(datei);
    	if(inhalt[zeichen] == ' ' || inhalt[zeichen] == '\n')
    		worte++;

    	inhalt[++zeichen] = '\0';
    }

    for(int i=0; i<26; i++)
    {
    	anz_buchstaben[i] = 0;

    	for(int l=0; l<zeichen; l++)
    	{
    		if(inhalt[l] == 'a' + i || inhalt[l] == 'A' + i)
    			anz_buchstaben[i]++;
    	}
    }

    printf("Inhalt:\n%s", inhalt);
    printf("\n\nZeichen: %d", zeichen);
    printf("\nWorte: %d\n", worte);
    for(int i=0; i<26; i++)
    	printf("%c: %d\t", 'a' + i, anz_buchstaben[i]);

    return 0;
}
```


mfg
umbrasaxum


----------



## jokey2 (12. Mai 2005)

Das mit dem Zählen der Leerzeichen haut nicht immer hin, denn es kann ja sein, daß in einem Text mehrere Leerzeichen hintereinanderstehen. Dadurch werden es ja nicht mehr Wörter im Text.


----------



## Tobias K. (12. Mai 2005)

moin


Stimmt genau, aber ich will ja auch nciht seine Hausaufgaben machen, sondern ihm zeigen wie es im Prinzip gehen würde.
Schnell überprüfen ob Leerzeichen doppelt sind ist ja kein Ding.


mfg
umbrasaxum


----------

