URL: https://www.overclockers.at/coding-stuff/bugs_in_fileread-programm_aber_wo_112768/page_1 - zur Vollversion wechseln!
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
Code:#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(); } }
Code:#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; }
Code:#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
schreib bitte "code" statt "quote" in den post, dann bleiben die einrückungen...
done
Das kann nicht funktionieren. Du musst ihm schon sagen, wie viele chars du brauchst.Code:wort=new (char[]); strcpy(wort, w);
aus scan()
das is verkehrt rum.. so wird das letzte wort der reihe schon zur nächsten zeile gezählt. also so wärs richtig:Code:if(*type=='\n') zeile++; string[i]='\0'; ptr->check(string, zeile); i=0;
Code:string[i]='\0'; ptr->check(string, zeile); i=0; if(*type=='\n') zeile++;
so.. habs mir nochmal angeschaut.
und hierCode: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; }
Code: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(); } }
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 :
Code:es ist wie es ist und nicht. anders! ?
Code:else { if (i > 0) { string[i]='\0'; ptr->check(string, zeile); i=0; } if(*type=='\n') // <- das vertauscht zeile++; }
Ein Problem hab ich leider noch und ich hab keine Ahnung woran das liegt.
Wenn folgendes in der chekit.txt steht:
ZitatWie 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!
filecheck.cpp
Code:#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; }
mat, du sollst 4.3 coden und nicht Hausübungsbeispiele der Member
es war die sucht nach c++
das is kein hausübungsbsp. verdammt...
bitte NOCH immer um Hilfe *g*
mfg
pseudo
aktualisiere die filecheck.cpp.. die ich dir oben gegeben habe.
DANKE funktioniert alles perfekt
Ich danke allen beteiligten und ganz besonders dir mat
DANKE
mfg
pseudo
overclockers.at v4.thecommunity
© all rights reserved by overclockers.at 2000-2025