Hilfe Programm Dateiverarbeitung
-
Hallo,
ich brauche Hilfe zu einem C-Programm, das ich für die Uni entwickeln muss.Es geht um Dateiverarbeitung.
Eine geöffnete Textdatei soll analysiert werden, d.h. herausgelesen werde wie oft bestimmte Begriffe in ihr vorkommen und die Anzahl in eine Variable geschrieben, die drauf in eine Info-Datei geschrieben wird.Ich habe es schon soweit, dass die Datei vom Programm über eine Menüleiste geöffnet werden kann. Leider komm ich ab jetzt nicht weiter, da mein Kenntnisstand sehr niedrig ist.
Danke im Voraus!
-
Zeig doch mal, was du schon an Code hast und wo du nicht weiter kommst.
Und wie kommt es eigentlich, dass inzwischen alle Anfänger irgendwie was mit einer GUI programmieren müssen, sowas geht doch erst mal alles über ein Kommandozeilentool.
-
Ja wir machen das Projekt mit eine windows application, in der dann alle Unterprogramme aufgerufen werden können und ggfs. auch Dinge grafisch dargestellt werden können.
int datei_oeffnen_lesen(char *adresse) { FILE *ptr; int i; int temp; ptr = fopen (adresse, "r"); if (ptr == NULL) { printf("\nIch konnte die Datei nicht oeffnen!"); } else { printf("\nDie Datei wurde geoeffnet!"); for (i=0; i<10;i++) { fscanf(ptr,"%s", &temp); printf("gelesen:%i\n", temp); } fclose (ptr); } printf("\n\n"); return 0; }
Die Adresse der Datei wird im Voraus über die Menüleiste und einer Windows-Suchfunktion ermittlt und in das Unterprogramm übertragen. Die Datei öffnet sich, aber in der Konsole stellt er nur das dar:
Es soll die Datei C:\EDV\lcc\lcc\Projekte\EDV2_Projekt\Testdateien\Test_oeffnen.txt geoeffnet werden Die Datei wurde geoeffnet!gelesen:-393167 gelesen:-393167 gelesen:-393167 gelesen:-393167 gelesen:-393167 gelesen:-393167 gelesen:-393167 gelesen:-393167 gelesen:-393167 gelesen:-393167
-
In Zeile 18 muss dein Compiler eine Warung geben!
(Wenn nicht, ändere den Warn-Level)Dein Einrückungsstil ist grauenhaft.
adresse ist der falsche Variablenname für einen Dateinamen.
Und du kannst den Rückgabewert benutzen, um der rufenden Funktion den Fehler mitzuteilen.
-
Hab den Fehler entdeckt.
Hatte einen Platzhalter %i statt %c.Jetzt bräuchte ich aber trotzdem ein Lösung, die die Datei von vorne bis hinten ließt und sie nach bestimmten Begriffen durchsucht und die Anzahl in eine Datei ausgeben kann.
-
Yannick schrieb:
Hab den Fehler entdeckt.
Hatte einen Platzhalter %i statt %c.Die einige Stelle in deinem gezeigten Code wäre beim
printf
.
Aber da war es eigentlich richtig.Wenn das %c aber trotzdem richtig sein sollte, ist der Formatstring vom
fscanf
und der Typ von temp falsch.
-
DirkB schrieb:
In Zeile 18 muss dein Compiler eine Warung geben!
(Wenn nicht, ändere den Warn-Level)Dein Einrückungsstil ist grauenhaft.
adresse ist der falsche Variablenname für einen Dateinamen.
Und du kannst den Rückgabewert benutzen, um der rufenden Funktion den Fehler mitzuteilen.
- Er gibt keine Warnung aus. Wieso müsste er das?
- Enrückstil hab ich angepasst und den Dateiname in "dateiname" geändert.
-
Yannick schrieb:
- Er gibt keine Warnung aus. Wieso müsste er das?
Yannick schrieb:
int temp; ... fscanf(ptr,"%s", &temp);
Weil "%s" der völlig falsche Formatspecifier für ein int ist.
%s dient zum einlesen von Strings (durch White-Space getrennte Zeichenfolgen), die dann nach C-Art mit '\0' terminiert werden.
Dazu muss im Speicherbereich aber genug Platz vorhanden sein.Ändere den Warn-Level vom Compiler und Behandele Warnungen wie Fehler.
Beseitige deren Ursache.
-
Yannick schrieb:
Jetzt bräuchte ich aber trotzdem ein Lösung, die die Datei von vorne bis hinten ließt und sie nach bestimmten Begriffen durchsucht und die Anzahl in eine Datei ausgeben kann.
Sag mal, seid ihr Studis von der Uni mittlerweile so unselbstständig dass ihr keines der 1 Millarde Beispiele im Internet zum Einlesen und Auswerten von Textdateien euch zur Brust nimmt? Man nennt sowas schlichtweg faul.
-
Fauler_Student schrieb:
Yannick schrieb:
Jetzt bräuchte ich aber trotzdem ein Lösung, die die Datei von vorne bis hinten ließt und sie nach bestimmten Begriffen durchsucht und die Anzahl in eine Datei ausgeben kann.
Sag mal, seid ihr Studis von der Uni mittlerweile so unselbstständig dass ihr keines der 1 Millarde Beispiele im Internet zum Einlesen und Auswerten von Textdateien euch zur Brust nimmt? Man nennt sowas schlichtweg faul.
Ich tu mich leider trotz der Beispiel ziemlich schwer damit, da mein Kenntnisstand wie man merkt ziemlich niedrig ist.
-
Auf diese Weise funktioniert das Einlesen zumindest jetzt:
int datei_oeffnen_lesen(char *dateiname) { FILE *ptr; int i; char temp[100]; ptr = fopen (dateiname, "r"); if (ptr == NULL) { printf("\nIch konnte die Datei nicht oeffnen!"); } else { printf("\nDie Datei wurde geoeffnet!\n"); for (i=0; i<10;i++){ fscanf(ptr,"%s", &temp); printf("gelesen:%s\n", temp); } fclose (ptr); } printf("\n\n"); return 0; }
-
Yannick schrieb:
Fauler_Student schrieb:
Yannick schrieb:
Jetzt bräuchte ich aber trotzdem ein Lösung, die die Datei von vorne bis hinten ließt und sie nach bestimmten Begriffen durchsucht und die Anzahl in eine Datei ausgeben kann.
Sag mal, seid ihr Studis von der Uni mittlerweile so unselbstständig dass ihr keines der 1 Millarde Beispiele im Internet zum Einlesen und Auswerten von Textdateien euch zur Brust nimmt? Man nennt sowas schlichtweg faul.
Ich tu mich leider trotz der Beispiel ziemlich schwer damit, da mein Kenntnisstand wie man merkt ziemlich niedrig ist.
Und das liegt woran? Keinen Bock gehabt was zu tun? Kein Bock gehabt was zu tun? Oder einfach nur keinen Bock gehabt was zu tun? Les dein Skript und lern die Grundlagen!
-
Yannick schrieb:
Auf diese Weise funktioniert das Einlesen zumindest jetzt:
In C heißt "funktioniert jetzt", nicht immer, dass es auch richtig ist.
fscanf(ptr,"%99s", temp);
ist sicherer.
-
Yannick schrieb:
Auf diese Weise funktioniert das Einlesen zumindest jetzt:
int datei_oeffnen_lesen(char *dateiname) { FILE *ptr; int i; char temp[100]; ptr = fopen (dateiname, "r"); if (ptr == NULL) { printf("\nIch konnte die Datei nicht oeffnen!"); } else { printf("\nDie Datei wurde geoeffnet!\n"); for (i=0; i<10;i++){ fscanf(ptr,"%s", &temp); printf("gelesen:%s\n", temp); } fclose (ptr); } printf("\n\n"); return 0; }
Dein Hauptproblem ist, dass du nicht wirklich weißt, wann was wie benutzt wird. Dir fehlen die einfachsten Grundlagen.
Schön, du meinst, es funktioniert, lassen wir das mal so stehen, kannst du wenigstens erklären warum es "funktioniert"?
-
maddin900 schrieb:
Yannick schrieb:
Auf diese Weise funktioniert das Einlesen zumindest jetzt:
int datei_oeffnen_lesen(char *dateiname) { FILE *ptr; int i; char temp[100]; ptr = fopen (dateiname, "r"); if (ptr == NULL) { printf("\nIch konnte die Datei nicht oeffnen!"); } else { printf("\nDie Datei wurde geoeffnet!\n"); for (i=0; i<10;i++){ fscanf(ptr,"%s", &temp); printf("gelesen:%s\n", temp); } fclose (ptr); } printf("\n\n"); return 0; }
Dein Hauptproblem ist, dass du nicht wirklich weißt, wann was wie benutzt wird. Dir fehlen die einfachsten Grundlagen.
Schön, du meinst, es funktioniert, lassen wir das mal so stehen, kannst du wenigstens erklären warum es "funktioniert"?Ja das weiß ich leider. Nur habe ich ziemlichen Zeitdruck und sollte es bis Freitag nächster Woche abgeben.
Durch die for-Schleife werden die ersten 10 strings ausgegeben. Jedoch benötige eine Schleife, die das ganze Textdokument bis zum letzten String ausgibt.
Wenn ich die for-Schleife mit einem
while (ptr != EOF)
austausche, erscheint eine Fehlermeldung
-
Yannick schrieb:
Wenn ich die for-Schleife mit einem
while (ptr != EOF)
austausche, erscheint eine Fehlermeldung
Dafür dass du Zeitdruck hast, lümmelst du hier ganz schön unnötig herum:
WAS FÜR EINE FEHLERMELDUNG?
Warum steht vor deiner Funktion eigentlich ein "int"?
-
maddin900 schrieb:
Yannick schrieb:
Wenn ich die for-Schleife mit einem
while (ptr != EOF)
austausche, erscheint eine Fehlermeldung
Dafür dass du Zeitdruck hast, lümmelst du hier ganz schön unnötig herum:
WAS FÜR EINE FEHLERMELDUNG?
Warum steht vor deiner Funktion eigentlich ein "int"?Ich sitze leider von morgens bis abends an dem Projekt, aber komme leider kaum voran.
void datei_oeffnen_lesen(char *dateiname) { FILE *ptr; int i; char temp[5]; char kurve[] = "CONS"; char kurve_auf_flaeche[] = "CURVE"; char traegerflaeche[] = "SURF"; int zaehler_kurve = 0; int zaehler_kurve_auf_flaeche = 0; int zaehler_traegerflaeche = 0; ptr = fopen (dateiname, "r"); if (ptr == NULL) { printf("\nIch konnte die Datei nicht oeffnen!"); } else { printf("\nDie Datei wurde geoeffnet!\n"); for (i=0; i<1000 ;i++){ fscanf(ptr,"%99s", &temp); printf("gelesen:%s\n", temp); if(strcmp(temp, kurve)== 0) { zaehler_kurve++; printf("Datei enthaelt Kurven %i mal\n", zaehler_kurve); } } } fclose (ptr); printf("\n\n"); }
Das habe ich bisher.
Wenn ich stattdessen eine while Schleife verwende:
while (ptr != EOF){ fscanf(ptr,"%99s", &temp); printf("gelesen:%s\n", temp); if(strcmp(temp, kurve)== 0) { zaehler_kurve++; printf("Datei enthaelt Kurven %i mal\n", zaehler_kurve); }
erscheint die Fehlermeldung: operands of != have illegal types 'pointer to struct_iobuf' + and 'int'
-
Wenn du von morgens bis abends an dem Projekt sitzen würdest wärst du schon fertig. Bist du mal auf die Idee gekommen zu schauen was es mit der Fehlermeldung auf sich hat? Oder dir mal angeschaut, wie man FILE benutzt? Es gibt wie gesagt 1 Millarde Beispiele, und DU willst hier erklären dass du von morgens bis abends daran "arbeitest" und es nicht hinbekommst?! Das glaubt dir hier niemand!
-
ptr ist auch ein dateihandle, während EOF eine ganzzahl ist.
also solltest du erst einmal herausfinden, wie du überprüfst, ob das dateiende erreicht ist: http://www2.hs-fulda.de/~klingebiel/c-stdlib/index.htm
-
ptr ist ein Zeiger (auf eine FILE Struktur)
EOF
ist ein Makro was (meist) als -1 definiert ist.Das passt nicht zusammen. (Ein Zeiger ist kein int)
Es gibt die Funktion
feof
im der Standard-Library.
Du kannst den Status aber erst nach der Leseoperation abfragen, daher ist diese while-Schleife auch nicht richtig.Kannst du mit "Rückgabewert einer Funktion" etwas anfangen?
Ja, dann schau mal http://www.cplusplus.com/reference/cstdio/fscanf/bei unter Return Value.
Nein, dann mach dich darüber mal schlau.