Datei einlesen -> suchen

Post Reply
Message
Author
gekko247
Posts: 5
Joined: 22. Mar 2005 12:55

Datei einlesen -> suchen

#1 Post by gekko247 »

Hallo Zusammen,

ich befasse mich seit kurzen mit C.

Code: Select all

#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: Select all

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


mfg

User avatar
Janka
Posts: 3585
Joined: 11. Feb 2006 19:10

#2 Post by Janka »

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
Posts: 5
Joined: 22. Mar 2005 12:55

#3 Post by gekko247 »

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

User avatar
Janka
Posts: 3585
Joined: 11. Feb 2006 19:10

#4 Post by Janka »

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
Posts: 5
Joined: 22. Mar 2005 12:55

#5 Post by gekko247 »

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: Select all

#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: Select all

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

User avatar
Janka
Posts: 3585
Joined: 11. Feb 2006 19:10

#6 Post by Janka »

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
Posts: 4
Joined: 26. Jun 2010 18:03
Location: Berlin

#7 Post by Newbee »

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

Post Reply