Hi. Habe mal wieder ein Problem:
Ich soll einen Text aus einer Datei (.txt) auslesen und in einer anderen wieder ablegen (alphabetisch sortiert und doppelte raus). Welche Dateien das sein sollen, soll per Parameter in der Konsole übergeben werden. Ein Wort ist eine fortlaufende Folgen von Zeichen A-Z sowie ÖÜÄ und ß. Die Groß- und Kleinschreibung ist hierbei nicht zu berücksichtigen. Alle Nicht-Wörter sind zu
ignorieren.
Per define sollen Obergrenzen für die Anzahl der Wörter bzw die Buchstaben eines Wortes angelegt werden.
Beim Überschreiten der Obergrenzen ist wie folgt vorzugehen:
- Länge eines Wortes ist zu lang : Fehlermeldung ausgeben, Wort ignorieren und mit der Bearbeitung fortfahren (kein Programmende)
- Anzahl der Wörter ist überschritten : Fehlermeldung ausgeben, restlichen Text ignorieren und bisheriges Wörterbuch in zweite Datei schreiben.
Sachen wie strcmp sind dabei nicht zu verwenden (wenn es nicht anders geht, zur Not auch das).
Ja und irgendwie klappt da bei mir beim sortieren / rausschmeißen der Dubletten etwas nicht. Vermutlich ist es eh umständlich geschrieben, aber irgendwie gehen mir gerade auch die Ideen aus
Ich poste einfach mal, was ich bisher habe:
Wäre super, wenn mir geholfen werden könnte
Beste!
Ich soll einen Text aus einer Datei (.txt) auslesen und in einer anderen wieder ablegen (alphabetisch sortiert und doppelte raus). Welche Dateien das sein sollen, soll per Parameter in der Konsole übergeben werden. Ein Wort ist eine fortlaufende Folgen von Zeichen A-Z sowie ÖÜÄ und ß. Die Groß- und Kleinschreibung ist hierbei nicht zu berücksichtigen. Alle Nicht-Wörter sind zu
ignorieren.
Per define sollen Obergrenzen für die Anzahl der Wörter bzw die Buchstaben eines Wortes angelegt werden.
Beim Überschreiten der Obergrenzen ist wie folgt vorzugehen:
- Länge eines Wortes ist zu lang : Fehlermeldung ausgeben, Wort ignorieren und mit der Bearbeitung fortfahren (kein Programmende)
- Anzahl der Wörter ist überschritten : Fehlermeldung ausgeben, restlichen Text ignorieren und bisheriges Wörterbuch in zweite Datei schreiben.
Sachen wie strcmp sind dabei nicht zu verwenden (wenn es nicht anders geht, zur Not auch das).
Ja und irgendwie klappt da bei mir beim sortieren / rausschmeißen der Dubletten etwas nicht. Vermutlich ist es eh umständlich geschrieben, aber irgendwie gehen mir gerade auch die Ideen aus

Ich poste einfach mal, was ich bisher habe:
Code:
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdlib.h>
#define WOERTER 100 // Wörter
#define BUCHSTABEN 25 // Anzahl der Buchstaben
void print(int gez_woerter, int tabelle[WOERTER][BUCHSTABEN+1], FILE *out){
int w, b = 0;
for (w = 0; w < gez_woerter; w++) {
if (tabelle[w][0] != '\0'){
for (b = 0; tabelle[w][b] != '\0'; b++) {
fprintf(out, "%c", tabelle[w][b]);
} fprintf(out, " ");}
} fprintf(out, "\n\n");
}
void swap(int wort1[], int wort2[]) {
int dreieck[BUCHSTABEN]; int b;
for(b = 0; wort1[b] != '\0'; b++)
dreieck[b] = wort1[b];
dreieck[b]='\0';
for(b = 0; wort2[b] != '\0'; b++)
wort1[b] = wort2[b];
wort1[b]='\0';
for(b = 0; dreieck[b] != '\0'; b++)
wort2[b] = dreieck[b];
wort2[b]='\0';
}
// Sortieren
void sort(int tabelle[WOERTER][BUCHSTABEN+1], int *gez_woerter) {
int w = 0, b = 0, k = 0;
for(w = 0; w < (*gez_woerter); w++) {
for(b = w + 1; b < (*gez_woerter); b++) {
if(tabelle[w][0] > tabelle[b][0]) {
swap(tabelle[w], tabelle[b]); }
else if(tabelle[w][0] == tabelle[b][0]) {
for (k = 1; tabelle[w][k] != '\0'; k++) {
if(tabelle[w][k] > tabelle[b][k]) {
swap(tabelle[w], tabelle[b]); break;
}
}
}
}
}
}
// Main
int main(int argc, char **argv) {
int tabelle[WOERTER][BUCHSTABEN+1]; // 2D Array für die Wörter
int w=0, b=0, gez_woerter = 0;
int c;
FILE *in,*out;
//int count=1;
// "Genug" Parameter eingegeben?
if (argc != 3) {
printf("Fehler: Ein- und Ausgabedatei muessen uebergeben werden\n\n");
system("PAUSE");
return EXIT_FAILURE; }
// Parameter übergeben
in = fopen (argv[1], "r");
out = fopen (argv[2], "w");
printf("\n\n\n");
printf("01 - Aufgabe 2 - Woerterbuch\n\n");
// Testausgabe stdout
printf("Infile: %s\n", argv[1]); printf("Outfile: %s\n\n", argv[2]);
// Eingabeüberprüfungen
if ((in == NULL) || (out == NULL)) { // Können Dateien geöffnet werden?
printf("Fehler beim Oeffnen der Datei(en)\n"); // Nein? Fehler.
fclose(in); fclose(out); // Dateien schließen
return EXIT_FAILURE; // Fehler zurückgeben
} else {
while ((c = fgetc(in)) != EOF) {
//printf("\n%d - %c",count++, c);
// Abfrage, ob es sich um einen der definierten Buchstaben handelt
if (((c >= 65) && (c <= 90)) /* Großbuchstaben*/ || ((c >= 97) && (c <= 122)) /*Kleinbuchstaben*/
|| (c == 252) /* ü */|| (c == 220) /* Ü */|| (c == 228) /* ä */ || (c == 196) /* Ä */ || (c == 246) /* ö */ || (c == 214) /* Ö */ || (c == 225) /* ß */ ) {
if ( ((c >= 65) && (c <=90)) || (c == 129) || (c == 132) || (c == 142) ) /* Großbuchstabe? */ c = c + 32;
tabelle[w][b] = c; // Falls es ein Buchstabe ist, dem 2D Array zuweisen
b++; // Im 2D-Array ein Feld nach rechts
} else {
//printf("\nKein Zeichen");
if (tabelle[w][0] != '\0') { // erstes Feld ein Buchstabe?
tabelle[w][b] = '\0'; // Dann mit '\0' als letztem Zeichen, die Zeile beenden
gez_woerter++; // Zähler für Wörter hochsetzen
tabelle[w+1][0] = '\0';
w++; // Eine Zeile nach unten, für neues Wort...
b = 0; // ... und bei 0 (ganz links) anfangen
} else b = 0; // Dann neues Wort anlegen - im 2D-Array links beginnend ...
}
}
if (tabelle[w][0] != '\0') {
tabelle[w][b] = '\0';
gez_woerter++;
w++;
b = 0;
}
}
// Testausgabe gezaehlter Woerter
fprintf(out, "Gezaehlte Woerter: %d\n", gez_woerter);
// Testausgabe der "unsortierten" Wörter in eine Datei
print(gez_woerter, tabelle, out);
// Sortieren
sort(tabelle, &gez_woerter);
// Testausgabe der "sortierten" Wörter in eine Datei
print(gez_woerter, tabelle, out);
// Dateien schließen
fclose(in); fclose(out);
printf("\n\n\n");
system("PAUSE");
return EXIT_FAILURE;
}
Wäre super, wenn mir geholfen werden könnte

Beste!