Bugs in Fileread-Programm aber wo?

Seite 1 von 1 - Forum: Coding Stuff auf overclockers.at

URL: https://www.overclockers.at/coding-stuff/bugs_in_fileread-programm_aber_wo_112768/page_1 - zur Vollversion wechseln!


das_pseudonym schrieb am 22.04.2004 um 23:58

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();
	}
}



filecheck.cpp

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;
}
 
	


filecheck.h


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 	

mfg

pseudo


DKCH schrieb am 23.04.2004 um 00:12

schreib bitte "code" statt "quote" in den post, dann bleiben die einrückungen...


mat schrieb am 23.04.2004 um 00:16

done :D


Ringding schrieb am 23.04.2004 um 00:26

Code:
	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 schrieb am 23.04.2004 um 00:29

aus scan()

Code:
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:
Code:
string[i]='\0';
ptr->check(string, zeile);
i=0;

if(*type=='\n')
	zeile++;


mat schrieb am 23.04.2004 um 00:46

so.. habs mir nochmal angeschaut.

Code:
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
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();
	}
}


das_pseudonym schrieb am 23.04.2004 um 14:19

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!
?


Danke für die schon geleistete und die hoffentlich kommende Hilfe.
DANKE

mfg

pseudo


mat schrieb am 23.04.2004 um 18:10

Code:
else 
{
	if (i > 0)
	{
		string[i]='\0'; 
		ptr->check(string, zeile); 
		i=0; 
	}

	if(*type=='\n')  // <- das vertauscht
		zeile++; 
} 


das_pseudonym schrieb am 23.04.2004 um 18:55

Ein Problem hab ich leider noch und ich hab keine Ahnung woran das liegt.
Wenn folgendes in der chekit.txt steht:

Zitat
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 schrieb am 23.04.2004 um 20:01

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;
}

ich hoff das passt jetzt dann..


Ringding schrieb am 24.04.2004 um 11:17

mat, du sollst 4.3 coden und nicht Hausübungsbeispiele der Member :)


mat schrieb am 24.04.2004 um 12:23

es war die sucht nach c++ :(


das_pseudonym schrieb am 24.04.2004 um 12:46

das is kein hausübungsbsp. verdammt...

bitte NOCH immer um Hilfe *g*

mfg

pseudo


mat schrieb am 24.04.2004 um 13:12

aktualisiere die filecheck.cpp.. die ich dir oben gegeben habe.


das_pseudonym schrieb am 24.04.2004 um 23:51

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