Zum Inhalt springen
View in the app

A better way to browse. Learn more.

Fachinformatiker.de

A full-screen app on your home screen with push notifications, badges and more.

To install this app on iOS and iPadOS
  1. Tap the Share icon in Safari
  2. Scroll the menu and tap Add to Home Screen.
  3. Tap Add in the top-right corner.
To install this app on Android
  1. Tap the 3-dot menu (⋮) in the top-right corner of the browser.
  2. Tap Add to Home screen or Install app.
  3. Confirm by tapping Install.

fopen

Empfohlene Antworten

Veröffentlicht

Hallo, also ich habe da ein Problem. Ich bin noch nicht so weit mit C++, habe im August erst damit angefangen (in meiner Ausbildung zur FIAE). Jetzt soll ich ein Programm entwickeln, welches Dateien 'scannt' und mir sagt ob ein bestimmtes Wort (welches der User vorher eingeben können soll) entahlten ist. Soweit so gut, alles verstanden, nur wie umsetzten? Mein Chef meint ich solldie Datei mit einem Befehl der 'fopen' heißt in mein Programm einschließen bzw. die Datei öffnen. Kann mir jemand sagen wie ich damit umzugehen habe, weil in der Library finde ich dazu nichts weiter...

Danke Bine

Hi Bine,

probier mal damit:

FILE *fp #initialisiert einen Pointer der in das File zeigt

char buffer[MAXSIZE]={NULL} #initialisert ein char Array

mit der groesse MAXSIZE in dem

der Inhalt des Files Zeilenweise gespeichert wird

fp = fopen(FileName,"r") # oeffnet das File; "r" heisst read only

while(1)

{

if(fgets(buffer,MAXSIZE,fp) == NULL) break;

#mit fgets liest du immer eine Zeile aus dem File

in buffer; diesen kannst du dan auf deinen suchbe

griff untersuchen.

MAXSIZE gibt an wieviel Zeilen fgets maximal lesen

soll; falls vor erreichen von Maxsize ein String-Enede zeichen kommen sollte liest er nur bis dahin;

Ist das File abgearbeitet liefert fgets einen NULL-

Pointer zurueck;

....

deine Suchroutine

....

}

Also wegen dem "Scan"-Algorhythmus, da habe ich ein paar verschiedene kleine Sources zu. Such Dir was möglichst Undurchschaubares raus und versuche damit alle rückwärts aus dem Sessel zu hauen, weil ein Normaler wohl kaum auf solch irre Lösungsmöglichkeiten kommen würde! Am besten Implementiere alle Suchalgorhythmen und lasse dem Anwender die Auswahl dazu!

Source1:

**************************************************

/* Brute-Force-Algorithmus */

/*

* In Puffer finden wir den Text, in Pattern das Suchmuster.

* Die Länge des Texts entnehmen wir der Variablen size.

*/

long Brute_Search(char *Puffer,char *Pattern, long size)

{

long i,j,M=strlen(Pattern),N=size;

for( i=0,j=0; j<M && i<N; i++, j++ )

while( Puffer != Pattern[j] && i<N ) {

i-=(j-1);

j=0;

}

if( j==M ) {

STFound++;

return i-M;

} else {

return i;

}

}

**************************************************

Source2+Source3 (gehören zusammen)

**************************************************

/* Diese Routine richtet das erforderliche Sprung-Array

* fürs Knuth-Morris-Pratt-Verfahren ein

*/

long NextArray[50]; /* Falls nötig, größer dimensionieren */

void InitNextArray(char *pattern)

{

long i,j, M=strlen(pattern);

NextArray[0]=-1;

for( i=0, j=-1; i<M; i++,j++,NextArray=

(pattern==pattern[j])? NextArray[j]:j )

while( (j>=0) && (pattern != pattern[j] ) )

j=NextArray[j];

}

**************************************************

Source3

**************************************************

/* Der Suchalgorithmus nach Knuth-Morris-Pratt

* eignet sich hervorragend für die Suche in externen

* Dateien

*/

extern long NextArray[];

long KMP_Search(char *Puffer,char *Pattern, long size)

{

long i,j,M=strlen(Pattern),N=size;

for( i=0,j=0; j<M && i<N; i++, j++ )

while( (j>=0) && (Puffer != Pattern[j]) && i<N )

j=NextArray[j];

if( j==M ) {

return i-M;

} else {

return i;

}

}

**************************************************

Source4+Source5 gehören zusammen

**************************************************

/* Das für die Vorgehensweise von Boyer-Moore benötigte

* Skip-Array läßt sich so kreieren

*/

long Skip[256];

void InitSkip(unsigned char *pattern)

{

long i,j, M=strlen(pattern);

for( i=0; i<256; Skip[i++]=M );

for( i=0,j=M-1; j>=0; j--,i++ )

if( Skip[pattern[j]] == M )

Skip[pattern[j]] = i ;

}

**************************************************

Source5

**************************************************

/* So einfach ist der extrem leistungsfähige

* Boyer-Moore-Algorithmus zu implementieren

*/

extern long Skip[];

long BM_Search(unsigned char *Puffer,

unsigned char *Pattern,

long size)

{

long i,j,M=strlen(Pattern),N=size,t;

for( i=M-1,j=M-1; j>=0; i--, j-- ) {

while( Puffer != Pattern[j] ) {

t=Skip[Puffer];

i+=(M-j>t)?M-j:t;

if( i>=N )

return N;

j=M-1;

}

M=strlen(Pattern);

}

return i;

}

**************************************************

Source6 frag nicht was d & q bedeuten sollen (häh?)

**************************************************

/* Das Robin-Karp-Verfahren ermöglicht lineare Suchzeiten,

* unabhängig von der Eingabe

*/

#define q 33554393

#define d 32

long RK_Search(unsigned char *Puffer,

unsigned char *Pattern,

long size)

{

long i,j,M=strlen(Pattern),N=size,dM=1,h1=0,h2=0;

for( i=1; i<M ; i++ )

dM=(d*dM)%q;

for( i=0; i<M ;i++ ) {

h1 = (h1 << 5 + (long)Pattern) % q;

h2 = (h2 << 5 + (long)Puffer) % q;

}

for( i=0; h1 != h2 ;i++ ) {

h2 = (h2 + d*q - (long)Puffer * dM) % q;

h2 = (h2<<5 + (long)Puffer[i+M]) % q;

if( i > N-M )

return N;

}

return i;

}

**************************************************

Viel Spaß!

ok, ich danke Euch ersteinmal, wobei ich sagen muss, dass ich das Programm schon gerne noch selber schreiben würde, weil es halt mein Projekt ist, und ich nur so eine Hilfe brauchte (bin halt noch nicht so weit)! Danke aber trotzdem...

Bine

<BLOCKQUOTE><font size="1" face="Verdana, Arial, Helvetica, sans-serif">Zitat:</font><HR>Original erstellt von Woodstock:

<STRONG> dass ich das Programm schon gerne noch selber schreiben würde, weil es halt mein Projekt ist, und ich nur so eine Hilfe brauchte (bin halt noch nicht so weit)! </STRONG>

Hey Crush,

glaubst du nicht, daß deine tollen kryptischen unkommentierten Suchteile nicht eventuell ein bischen herausfordernd sind für einen Anfänger?

Bine, fang erst mal damit an, die Datei zeilenweise einzulesen. Danach kannst du dann die einzelnen Worte in der Zeile in einem String abspeichern und wieder ausgeben. Wenn du das hast bist du schon fast fertig.

Am Anfang solltest du darauf achten, nicht zu viel auf einmal zu machen, sondern immer kleine Schritte vorwärts zu gehen. Sonst verlierst du leicht den Überblick.

Viel Erfolg!

Poldi, die sich vor gar nicht allzulanger Zeit auch noch mit so netten Aufgaben beschäftigen durfte ... aber jetzt wird sie von ihrem Chef gnadenlos ausgebeutelt ... *schnüff* ... als Programmiermaschine ... *schluchz*

... schnell, lauf weg solange du noch kannst ... :D:D:D:D

<BLOCKQUOTE><font size="1" face="Verdana, Arial, Helvetica, sans-serif">Zitat:</font><HR>Original erstellt von Poldi:

<STRONG> Danach kannst du dann die einzelnen Worte in der Zeile in einem String abspeichern und wieder ausgeben. Wenn du das hast bist du schon fast fertig.</STRONG>

Ok, also ihr seid wirklich lieb! Bin auch schon etwas weiter, und mein Chef meint auch es wäre auch ganz ok wenn ich noch nicht alles auf einmal kann. Also, geöffnet bekomme ich meine Datei jetzt schon mal *freu*, jetzt muss ich halt die Zeilen oder Wörter auslesen und in Arrays speichern, denke ich, oder?

Bin auch weiterhin für Eure Tips dankbar!

Bine

Hi Woodstck,

Hasi hat recht probiers mal so:

if (strstr(buffer1,"Suchbegriff")

printf ("Suchbegriff gefunden");

else

printf ("Suchbegriff nicht gefunden")

strstr vergleicht den Inhalt eines Puffers mit einem Pattern, wie du dein File Zeilenweise in den Puffer liest hab ich ja oben schon beschrieben.

Statt "Suchbegriff" kannst du hier natuerlich auch eine Variabel als Pattern verwenden.

Wird das Pattern in Puffer gefunden wird 1 als returnwert geliefert ansonsten null

Hmm, noch eine Frage, achtet er beim Vergleichen auf Groß- und Kleinschreibung? Und wenn ja, kann ichdas irgendwie ausschalten?

Bine

<BLOCKQUOTE><font size="1" face="Verdana, Arial, Helvetica, sans-serif">Zitat:</font><HR>Original erstellt von Woodstock:

<STRONG>Hmm, noch eine Frage, achtet er beim Vergleichen auf Groß- und Kleinschreibung? Und wenn ja, kann ichdas irgendwie ausschalten?

Bine</STRONG>

Ok, nenn mich jetzt total blöd, aber es klappt nicht. Ich habe versucht das mit dem zu suchenden Wort zu tun. Ungefähr so:

void main()

{

FILE *fz;

char buffer[20]={NULL};

char Eingabe;

cout << "Bitte das gesuchte Wort eingeben: ";

cin >> Eingabe;

_strlwr(Eingabe);

cout << Eingabe << "\n\n";/*

}

darauf hin sagt er mir das er nicht von char zu char* konvertieren kann:

->

void main()

{

FILE *fz;

char buffer[20]={NULL};

char Eingabe[20];

cout << "Bitte das gesuchte Wort eingeben: ";

cin >> Eingabe;

_strlwr(Eingabe);

cout << Eingabe << "\n\n";/*

}

Jetzt compilt und linkt er, aber das Ergebnis ist trotzdem nicht das welches es sein sollte, denn ich wollte ja jetzt die umgewandelte Form meiner Eingabe ausgeben. Was mache ich falsch? (Wahrscheinlich bin ich einfach zu blöd dazu...)

Bine

 #include "stdafx.h"

#include "string.h"

#include "iostream.h"


void main()

{

	char Eingabe[100];

	cout << "Bitte das gesuchte Wort eingeben: ";

	cin >> Eingabe;

	cout << Eingabe << "\n\n";	//gibt deine eingabe vor der Konvertierung aus

	_strlwr(Eingabe);

	cout << Eingabe << "\n\n";		//gibt deine eingabe nach der Konvertierung aus

}

 

<FONT COLOR="#a62a2a" SIZE="1">[ 25. September 2001 12:25: Beitrag 1 mal editiert, zuletzt von Hasi ]</font>

Hmm, ich glaube es liegt an einer der Header Dateien die ich nicht includet habe. Hab von der noch nichts gehört. versuche es mal eben...

Bine

<BLOCKQUOTE><font size="1" face="Verdana, Arial, Helvetica, sans-serif">Zitat:</font><HR>Original erstellt von Woodstock:

<STRONG>Hmm, ich glaube es liegt an einer der Header Dateien die ich nicht includet habe. Hab von der noch nichts gehört. versuche es mal eben...</STRONG>

Also ich arbeite mit dem Visual Studio 6.0! Wozu ist diese include Datei da? Weil ich brauche sie dafür jetzt wirklich nicht. Klappt nämlich, danke...

Bine

<BLOCKQUOTE><font size="1" face="Verdana, Arial, Helvetica, sans-serif">Zitat:</font><HR>Original erstellt von Woodstock:

<STRONG>Also ich arbeite mit dem Visual Studio 6.0! Wozu ist diese include Datei da? Weil ich brauche sie dafür jetzt wirklich nicht. Klappt nämlich, danke...</STRONG>

Tja, und noch ein Problem:

Er liest in meinem Programm nur die erste Zeile der Datei die ich ihm gebe. Was ist in meinem Quelltext noch falsch?void main()

{

FILE *fz;

char buffer[101]={NULL};

char Eingabe[101];

int i=0;

cout << "Bitte das gesuchte Wort eingeben: ";

cin >> Eingabe;

// cout << Eingabe << "\n";

_strlwr(Eingabe);

// cout << Eingabe << "\n\n";

fz = fopen ("c:\\personal\\E-Mail Liste.txt", "r");

if (fz == NULL)

cout << "Fehler, Datei nicht gefunden!\n\n";

else

fgets(buffer, 100, fz);

if (strstr(buffer,"Eingabe"))

{

cout << "Suchbegriff gefunden";

cout << Eingabe << "\n\n";

}

else

cout << "Suchbegriff nicht gefunden\n\n";

}

<BLOCKQUOTE><font size="1" face="Verdana, Arial, Helvetica, sans-serif">Zitat:</font><HR>Original erstellt von Woodstock:

[QB]fgets(buffer, 100, fz); [QB]

probiers mal so:

while ( (fgets(buffer,100,fz) != 0) {

...

}

dann wiederholt er das zwischen den klammern für jede zeile in der input datei ein mal.

oder schlag mal unter eof (end of file) nach. das geht so ähnlich.

100 zeichen pro zeile könnte was knapp werden. setz das lieber was höher, auf tausend oder so.

Danke Euch, jetzt klappt es so wie es soll. Erste Stufe geschafft, jetzt kommt die nächste...

Eventuell bis gleich.

Bine

Hey, hab noch eine Frage:

Meine Quelldatei sieht jetzt so aus:

void main()

{

FILE *fz;

char buffer[1001]={NULL};

char Eingabe[101];

int i=0;

fz = fopen ("c:\\personal\\EMailListe.txt", "r");

if (fz == NULL)

cout << "Fehler, Datei nicht gefunden!\n\n";

else

{

cout << "Bitte das gesuchte Wort eingeben: ";

cin >> Eingabe;

_strlwr(Eingabe);

do

{

fgets(buffer, 1000, fz);

_strlwr(buffer);

if(strstr (buffer, Eingabe))

{

cout << "\nSuchbegriff gefunden!\n\n";

break;

}

} while ((fgets (buffer, 1000, fz))!= 0);

}

}

Wie kann ich das jetzt noch machen das wenn der gesuchte Begriff nicht gefunden wurde, ich anzeigen lassen kann das der Suchbegriff nicht gefunden wurde? Müsste ich doch irgendwie machen können, nur in die 'do while - Schleife' kann ich das ja nicht mit reinbringen! Muss ich dazu die 'do while - Schleife' auch in eine Schleife setzten?

Bine

Hi Woodstock,

fueg halt noch ne Variable ein, die wenn der String gefunden wird den Wert 1 erhaelt uind wenn nicht dann den WErt 0.

Nach ablauf der schleife pruefst du dann den Wert der Variable und gibts bei Wert=0 eine fehlermeldung aus.

z. B:

do

{

fgets(buffer, 1000, fz);

_strlwr(buffer);

if(strstr (buffer, Eingabe))

{

cout << "\nSuchbegriff gefunden!\n\n";

Fehler=0;

break;

}

else

{

Fehler=1;

}

} while ((fgets (buffer, 1000, fz))!= 0);

If (Fehler==1) printf("Pattern in File nicht gefunden");

Archiv

Dieses Thema wurde archiviert und kann nicht mehr beantwortet werden.

Configure browser push notifications

Chrome (Android)
  1. Tap the lock icon next to the address bar.
  2. Tap Permissions → Notifications.
  3. Adjust your preference.
Chrome (Desktop)
  1. Click the padlock icon in the address bar.
  2. Select Site settings.
  3. Find Notifications and adjust your preference.