Datei einlesen -> suchen

Antworten
Nachricht
Autor
gekko247
Beiträge: 5
Registriert: 22. Mär 2005 12:55

Datei einlesen -> suchen

#1 Beitrag von gekko247 » 20. Mär 2010 9:45

Hallo Zusammen,

ich befasse mich seit kurzen mit C.

Code: Alles auswählen

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int main&#40;&#41;

&#123;

FILE *file;
char input&#91;300&#93;;
char* Ergebnis;

/*Einlesen */

file = fopen &#40; "suchen.txt" , "r" &#41;;

if &#40; NULL == file &#41; 

&#123;

printf &#40;"Datei nicht gefunden.\n"&#41;;

return 1;
&#125;

else

&#123;

fgets &#40; input, 300, stdin &#41;;

Ergebnis=strstr&#40;file,input&#41;;

printf&#40;"%s\n\n",Ergebnis&#41;;

&#125;

return 0;

&#125;
Ich bekomme folgende Fehlermeldung:

Code: Alles auswählen

Warnung&#58; Uebergabe des Arguments 1 von »strstr« von inkompatiblem Zeigertyp
Mir ist da nicht ganz klar, was da falsch ist.


mfg

Benutzeravatar
Janka
Beiträge: 3580
Registriert: 11. Feb 2006 19:10

#2 Beitrag von Janka » 21. Mär 2010 4:44

Du hast oben "file" als einen Zeiger auf eine Struktur vom Typ "FILE" definiert und benutzt das auch entsprechend mit fopen(). Unten willst du "file" aber in der Funktion strstr() benutzen. Diese Funktion braucht zwei Zeiger auf nullterminierte char-Arrays, um richtig zu funktionieren.

Im übrigen ist das eine Warnung, kein Fehler. C hindert dich nicht daran, dir auf diese Weise in den Fuß zu ballern. Das macht erst der Prozessor, wenn er den Mist dann ausführen soll. Schwankend zwischen ungewolltem Ergebnis und SIGSEGV vermutlich.

Janka
Ich vertonne Spam immer in /dev/dsp statt /dev/null.
Ich mag die Schreie.

gekko247
Beiträge: 5
Registriert: 22. Mär 2005 12:55

#3 Beitrag von gekko247 » 21. Mär 2010 5:32

Du hast oben "file" als einen Zeiger auf eine Struktur vom Typ "FILE" definiert und benutzt das auch entsprechend mit fopen(). Unten willst du "file" aber in der Funktion strstr() benutzen. Diese Funktion braucht zwei Zeiger auf nullterminierte char-Arrays, um richtig zu funktionieren.
Ich stehe mit C ziemlich am Anfang,wie muss das genau aussehen?

mfg

Benutzeravatar
Janka
Beiträge: 3580
Registriert: 11. Feb 2006 19:10

#4 Beitrag von Janka » 21. Mär 2010 14:28

Du hast nicht gesagt was du erreichen willst. Wie soll man dir dann erklären, wie das am besten geht?

Janka
Ich vertonne Spam immer in /dev/dsp statt /dev/null.
Ich mag die Schreie.

gekko247
Beiträge: 5
Registriert: 22. Mär 2005 12:55

#5 Beitrag von gekko247 » 21. Mär 2010 16:54

HI,
Du hast nicht gesagt was du erreichen willst. Wie soll man dir dann erklären, wie das am besten geht?
Ich habe das Programm noch einmal modifiziert.

Code: Alles auswählen

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int main&#40;&#41;

&#123;

FILE *file;
char input&#91;300&#93;;
char* Ergebnis;

/*Einlesen */

file = fopen &#40; "suchen.txt" , "r" &#41;;

if &#40; NULL == file &#41; 

&#123;

printf &#40;"Datei nicht gefunden.\n"&#41;;

return 1;
&#125;

else

&#123;

printf &#40;"Bitte geben Sie das gesuchte wort ein! "&#41;;

fgets &#40; input, 300, stdin &#41;;

Ergebnis=strstr&#40;file,input&#41;;

printf&#40;"%s\n\n",Ergebnis&#41;;

&#125;

return 0;

&#125;
Im Grunde soll das Programm ein Deutsch-Spanisch Wörterbuch werden.
Mir ist schon klar, das dies einfacher mit einer Datenbankabfrage zu realisieren ist, aber das ganze soll mehr als Lernfaktor dienen.

Die Datei suchen.txt ist so aufgebaut.

Code: Alles auswählen

wir gehen        ;   vamos
das zuhause   ;   la casa
Also soll nach einen vordefinierten Suchparameter in Datei suchen.txt gesucht werden und alle Ergebnis wo der Suchbegriff vorkommt, ausgegeben werden.

mfg

Benutzeravatar
Janka
Beiträge: 3580
Registriert: 11. Feb 2006 19:10

#6 Beitrag von Janka » 21. Mär 2010 23:40

Wenn du ernsthaft mit C programmieren willst, solltest du mit so wenig Stringverarbeitung wie nur irgend möglich anfangen. Das ist in C nämlich sehr aufwendig, fehleranfällig und in der Konsequenz für Anfänger frustrierend.

Was du tun willst, verlangt grundsätzlich nach sehr sehr viel Programmcode. Du musst die Datei zeilenweise auslesen (fgets()), dabei jede Zeile z.B. mit strtok() am ; in zwei Teilstrings aufteilen und dann jeweils prüfen, ob der erste Teilstring identisch mit der Benutzereingabe ist. Diesen letzten Schritt kannst du dann mit strstr() (oder simpler mir strcmp()) machen. Regexes oder so'n Zeug kann das dann immer noch nicht, dafür braucht man nochmals viel mehr Programmcode.

Ich mache es nach Möglichkeit so, dass ich ein Skript für alle String-intensiven Teile eines Programms bastle und nur die zeitkritischsten Sachen in C programmiere.

Janka
Ich vertonne Spam immer in /dev/dsp statt /dev/null.
Ich mag die Schreie.

Newbee
Beiträge: 4
Registriert: 26. Jun 2010 18:03
Wohnort: Berlin

#7 Beitrag von Newbee » 05. Jul 2010 23:38

Hallo,
ich sehe das etwas anders als Janka - Du mußt Dich auch mit den komplizierten Sachverhalten der Sprache so wie Stringverarbeitung auseindersetzen; das wäre sonst so wie eine Fremdsprache, die man abbricht, weil schwierige Probleme auftauchen.
Sicher gibt's einfachere Varianten z.B. über Skripte, aber man möchte ja gern alles aus einem Guß haben.
Wenn es okay für Dich ist, verwende ich Deinen Quellcode und probiere mal ein wenig.
Bin leider etwas raus aus der Materie, möchte aber wieder reinkommen.
Falls ich die Lösung finde und sie sonst keiner bringt poste ich sie hier - wird etwas dauern.
Das Programmierziel Wörterbuch finde ich gut :-)

Grüße, Newbee
never dismiss a plan, try time and again

Antworten