das_pseudonym
Little Overclocker
|
Aufgabe des Programms isses ne Datei einzulesen, und für jedes Wort in der Datei ein Objekt anzulegen in dem Objekt steht das WORT die ZEILEN in denen es vorkommt und ein pointer auf das nächste wort (link-list) Nicht vergessen ne checkit.txt in dem ordner der datein zu erstellen! Das Programm ist fast fertig es sind nur noch ein paar Bugs enthalten. Bitte helft mir sie zu beheben! Folgende Probleme: .) wenn man das Programm ausführt und 2 mal die datei eingescannt dann werden die Zeilen in denen das Wort vorkommt 2 mal gespeichert. .) Wenn das letzte Zeichen gleich a-Z 0-9 - oder _ ist dann wird das nicht registrtert--> weil die schleife unterbrochen wird da das dateiende schon erreicht is Wie lös ich das??? Bitte seid so gütig und schaut euch den Quellcode an! DANKE im voraus main.cpp #include <iostream.h>
#include <fstream.h>
#include <stdio.h>
#include <windows.h>
#include <ctype.h>
#include "filecheck.h"
int scan();
void output();
word *ptr;
word *first;
int main()
{
char ent;
ptr=new word("Start", 0);
first=ptr;
while(1)
{
ptr=first;
system("cls");
cout<<"\t\tFilecheck v1.0";
cout<<"\n\n[D]atei scannen";
cout<<"\n[A]usgabe des Ergebnis";
cout<<"\n[B]eenden";
cout<<"\n\nIhre Wahl: ";
cin>>ent;
switch(ent)
{
case 'd':
case 'D':
scan();
break;
case 'a':
case 'A':
output();
break;
case 'b':
case 'B':
return 0;
break;
default: break;
}
}
return 0;
}
int scan()
{
FILE* datei;
char string[50];
char *type;
int zeile=1;
int i=0;
type=new char;
datei=fopen("checkit.txt", "r");
while(feof(datei) == 0)
{
fread(type, 1, 1, datei);
if(isalnum(*type) || *type=='_' || *type=='-')
{
string[i]=*type;
i++;
}
else
{
if(*type=='\n')
zeile++;
string[i]='\0';
ptr->check(string, zeile);
i=0;
}
}
fclose(datei);
return 0;
}
void output()
{
system("cls");
if(&ptr->getptr()!=NULL)
{
ptr=&ptr->getptr();
while((&ptr->getptr())!=NULL)
{
cout<<*ptr;
ptr=&ptr->getptr();
}
cin.get();
cin.get();
}
else
{
cout<<"\n\n\n\n\n\n\t\t\t\tDatei leer!";
cin.get();
cin.get();
}
}
filecheck.cpp #include <iostream.h>
#include <string.h>
#include "filecheck.h"
word::word(char* w, int r)
{
int x=0;
wort=new (char[]);
strcpy(wort, w);
zeile = new row(r);
next=NULL;
}
word::~word()
{
delete zeile;
}
word& word::getptr()
{
return *next;
}
word& word::check(char* w, int r)
{
word* obj;
row* obj2;
obj=this;
while(obj->next!=NULL)
{
if(strcmp(obj->next->wort, w)==0)
break;
obj=obj->next;
}
if(obj->next==NULL)
{
obj->next=new word(w, r);
}
else
{
obj2=obj->next->zeile;
if(obj2->getfeld()==r)
return *this;
while((&obj2->getrow())!=NULL)
{
if(obj2->getfeld()==r)
return *this;
obj2=&obj2->getrow();
}
obj2->makeobj(r);
}
return *this;
}
int row::getfeld()
{
return feld;
}
void row::makeobj(int r)
{
reihe=new row(r);
}
row& row::getrow()
{
return *reihe;
}
ostream& operator<<(ostream& ausg, row& obj)
{
cout<<obj.feld;
return ausg;
}
row::row(int r)
{
feld=r;
reihe=NULL;
}
ostream& operator<<(ostream& ausg, word& obj)
{
row *ptr;
ptr=obj.zeile;
if(ptr!=NULL)
{
cout<<obj.wort<<"\tIn Reihe(n): ";
while(ptr!=NULL)
{
cout<<*ptr<<", ";
ptr=&ptr->getrow();
}
cout<<"\b\b \n";
}
return ausg;
}
filecheck.h #include <iostream.h>
#ifndef _FILECHECK_H_
#define _FILECHECK_H_
class row
{
protected:
row* reihe;
int feld;
public:
int getfeld();
void makeobj(int r);
friend ostream& operator<<(ostream& ausg, row& obj);
row(int =0);
row& getrow();
};
class word
{
row* zeile;
char* wort;
word* next;
public:
word(char* ,int r=0);
~word();
friend ostream& operator<<(ostream& ausg, word& obj);
word& getptr();
word& check(char* w, int r);
};
#endif
mfg pseudo
Bearbeitet von das_pseudonym am 24.04.2004, 23:51
|
DKCH
Administrator ...
|
schreib bitte "code" statt "quote" in den post, dann bleiben die einrückungen...
|
mat
AdministratorLegends never die
|
done
|
Ringding
Pilot
|
wort=new (char[]);
strcpy(wort, w);
Das kann nicht funktionieren. Du musst ihm schon sagen, wie viele chars du brauchst. Ad 1. Da brauchst du halt irgendeine Funktion, die dir den Urzustand wiederherstellt. Ad 2. Musst du halt das, was im entsprechenden else passiert, hinter der Schleife auch noch machen (unter den richtigen Bedingungen - nämlich dass er grad in der Schleife mit isalnum war)
|
mat
AdministratorLegends never die
|
aus scan() if(*type=='\n')
zeile++;
string[i]='\0';
ptr->check(string, zeile);
i=0;
das is verkehrt rum.. so wird das letzte wort der reihe schon zur nächsten zeile gezählt. also so wärs richtig: string[i]='\0';
ptr->check(string, zeile);
i=0;
if(*type=='\n')
zeile++;
|
mat
AdministratorLegends never die
|
so.. habs mir nochmal angeschaut. int scan()
{
FILE* datei;
char string[50];
char *type;
int zeile=1;
int i=0;
type=new char;
*type='x';
bool bDone = false;
datei=fopen("checkit.txt", "r");
while(!bDone)
{
if (fread(type, 1, 1, datei) == 0) // <- das + bDone damit das letzte wort des files auch verarbeitet wird
{
*type = '\n';
bDone = true;
}
if(isalnum(*type) || *type=='_' || *type=='-')
{
string[i]=*type;
i++;
}
else
{
string[i]='\0';
ptr->check(string, zeile);
i=0;
if(*type=='\n') // <- das vertauscht
zeile++;
}
}
delete type; // <- delete wurde vergessen
fclose(datei);
return 0;
}
und hier void output()
{
system("cls");
if(&ptr->getptr()!=NULL)
{
ptr=&ptr->getptr();
while(ptr) // <- hier wurde um 1 wort zu früh abgebrochen
{
cout<<*ptr;
ptr=&ptr->getptr();
}
cin.get();
cin.get();
}
else
{
cout<<"\n\n\n\n\n\n\t\t\t\tDatei leer!";
cin.get();
cin.get();
}
}
|
das_pseudonym
Little Overclocker
|
Danke euch allen ihr habt mir echt geholfen! Das Programm funktioniert jetzt einwandfrei bis auf den Fall wenn am Ende einer zeile ein zeichen steht das nicht die bedingungen isalnum() , '-' bzw '_' erfüllt dann wird dafür auch ein Objekt erstellt! und anschließend angezeigt Probiert mal das dann seht ihrs: checkit.txt : es ist wie
es ist
und
nicht.
anders!
?
Danke für die schon geleistete und die hoffentlich kommende Hilfe. DANKE mfg pseudo
Bearbeitet von das_pseudonym am 23.04.2004, 14:26
|
mat
AdministratorLegends never die
|
else
{
if (i > 0)
{
string[i]='\0';
ptr->check(string, zeile);
i=0;
}
if(*type=='\n') // <- das vertauscht
zeile++;
}
|
das_pseudonym
Little Overclocker
|
Ein Problem hab ich leider noch und ich hab keine Ahnung woran das liegt. Wenn folgendes in der chekit.txt steht: Wie geht es Ihnen!?
Haben Sie noch etwas zu Wird das zuviel fuer den Compiler?
Was meinen Sie dazu?
Noch etwas?
Ja noch sehr viel
Danke! Der Text is irrelevant, wichtig ist... das das Wort bei der Ausgabe beim wort "zu" die zeile und ein beistrich steht und bei das steht nur der Beistrich aber wie kommt das??? liegt das an der output() ??? Die aktuelle Version is meine gepatcht durch mat's scan() und seine zuletzt gepostete output() funktion. mfg pseudo
|
mat
AdministratorLegends never die
|
filecheck.cpp #include <iostream.h>
#include <string.h>
#include "filecheck.h"
word::word(char* w, int r)
{
int x=0;
wort = strdup(w); // <- weniger code
zeile = new row(r);
next=NULL;
}
word::~word()
{
delete [] wort; // <- hast vergessen
delete zeile;
}
word& word::getptr()
{
return *next;
}
word& word::check(char* w, int r)
{
word* obj;
row* obj2;
obj=this;
while(obj->next!=NULL)
{
if(strcmp(obj->next->wort, w)==0)
break;
obj=obj->next;
}
if(obj->next==NULL)
{
obj->next=new word(w, r);
}
else
{
obj2=obj->next->zeile;
if(obj2->getfeld()==r)
return *this;
while((&obj2->getrow())!=NULL)
{
if(obj2->getfeld()==r)
return *this;
obj2=&obj2->getrow();
}
obj2->makeobj(r);
}
return *this;
}
int row::getfeld()
{
return feld;
}
void row::makeobj(int r)
{
reihe=new row(r);
}
row& row::getrow()
{
return *reihe;
}
ostream& operator<<(ostream& ausg, row& obj)
{
ausg << obj.feld; // nicht cout!
return ausg;
}
row::row(int r)
{
feld=r;
reihe=NULL;
}
ostream& operator<<(ostream& ausg, word& obj)
{
row *ptr;
ptr=obj.zeile;
if(ptr!=NULL)
{
ausg << obj.wort << "\tIn Reihe(n): "; // nicht cout.. wie oben
while(ptr!=NULL)
{
ausg << *ptr;
ptr=&ptr->getrow();
if (ptr)
ausg << ",";
}
ausg << "\n";
}
return ausg;
}
ich hoff das passt jetzt dann..
|
Ringding
Pilot
|
mat, du sollst 4.3 coden und nicht Hausübungsbeispiele der Member
|
mat
AdministratorLegends never die
|
es war die sucht nach c++
|
das_pseudonym
Little Overclocker
|
das is kein hausübungsbsp. verdammt...
bitte NOCH immer um Hilfe *g*
mfg
pseudo
|
mat
AdministratorLegends never die
|
aktualisiere die filecheck.cpp.. die ich dir oben gegeben habe.
|
das_pseudonym
Little Overclocker
|
DANKE funktioniert alles perfekt Ich danke allen beteiligten und ganz besonders dir mat
DANKE
mfg
pseudo
|