"We are back" « oc.at

Bugs in Fileread-Programm aber wo?

das_pseudonym 22.04.2004 - 23:58 744 14
Posts

das_pseudonym

Little Overclocker
Avatar
Registered: May 2003
Location: Wien
Posts: 112
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
Bearbeitet von das_pseudonym am 24.04.2004, 23:51

DKCH

Administrator
...
Registered: Aug 2002
Location: #
Posts: 3340
schreib bitte "code" statt "quote" in den post, dann bleiben die einrückungen...

mat

Administrator
Legends never die
Avatar
Registered: Aug 2003
Location: nö
Posts: 25691
done :D

Ringding

Pilot
Avatar
Registered: Jan 2002
Location: Perchtoldsdorf/W..
Posts: 4300
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

Administrator
Legends never die
Avatar
Registered: Aug 2003
Location: nö
Posts: 25691
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

Administrator
Legends never die
Avatar
Registered: Aug 2003
Location: nö
Posts: 25691
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

Little Overclocker
Avatar
Registered: May 2003
Location: Wien
Posts: 112
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
Bearbeitet von das_pseudonym am 23.04.2004, 14:26

mat

Administrator
Legends never die
Avatar
Registered: Aug 2003
Location: nö
Posts: 25691
Code:
else 
{
	if (i > 0)
	{
		string[i]='\0'; 
		ptr->check(string, zeile); 
		i=0; 
	}

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

das_pseudonym

Little Overclocker
Avatar
Registered: May 2003
Location: Wien
Posts: 112
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

Administrator
Legends never die
Avatar
Registered: Aug 2003
Location: nö
Posts: 25691
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

Pilot
Avatar
Registered: Jan 2002
Location: Perchtoldsdorf/W..
Posts: 4300
mat, du sollst 4.3 coden und nicht Hausübungsbeispiele der Member :)

mat

Administrator
Legends never die
Avatar
Registered: Aug 2003
Location: nö
Posts: 25691
es war die sucht nach c++ :(

das_pseudonym

Little Overclocker
Avatar
Registered: May 2003
Location: Wien
Posts: 112
das is kein hausübungsbsp. verdammt...

bitte NOCH immer um Hilfe *g*

mfg

pseudo

mat

Administrator
Legends never die
Avatar
Registered: Aug 2003
Location: nö
Posts: 25691
aktualisiere die filecheck.cpp.. die ich dir oben gegeben habe.

das_pseudonym

Little Overclocker
Avatar
Registered: May 2003
Location: Wien
Posts: 112
DANKE funktioniert alles perfekt
Ich danke allen beteiligten und ganz besonders dir mat

DANKE

mfg

pseudo
Kontakt | Unser Forum | Über overclockers.at | Impressum | Datenschutz