[C++] tekstfile inlezen en wat bewerkingen

Status
Niet open voor verdere reacties.

thejasper110

Gebruiker
Lid geworden
24 okt 2007
Berichten
9
Hallo

Ik heb als opdracht alle 123's zoeken in een bestand (zie bijlage) in alle richtingen en dan het aantal afdrukken. Maar telkens als ik het programma run hangt hij :( Wie weet wat ik misdeed?
Hier m'n code:

Code:
#include <iostream>
#include <fstream>
#include <conio.h>
#include <stdio.h>
using namespace std;

int main()
{
    FILE * MyFile;

	const int lengte=100, breedte=101;
	int array[lengte][breedte], aantal=0,c=0;

    MyFile=fopen ("aap.txt","r");

	if(MyFile==NULL)
		cout<<"File kon niet worden geopend";
	else
	{
		for(int i=0; i<breedte; i++) //rij
		{
			for(int j=0; j<lengte; j++) //kolom
				c=fgetc(MyFile);
				if(c=='1'||c=='2'||c=='3')
                     array[lengte][breedte]=c;
		}
	}
	fclose(MyFile);

	for(int i=0; i<breedte; i++) //rij
	{
		for(int j=0; j<lengte; j++) //kolom
		{
			if(array[lengte][breedte]==1) //als er een 1 element wordt gevonden
			{
				if(array[lengte+1][breedte+1]==2&&array[lengte+2][breedte+2]==3) //rechts boven
					aantal++;
				if(array[lengte-1][breedte-1]==2&&array[lengte-2][breedte-2]==3) //links beneden
					aantal++;
				if(array[lengte+1][breedte-1]==2&&array[lengte+2][breedte-2]==3) //rechts beneden
					aantal++;
				if(array[lengte-1][breedte+1]==2&&array[lengte-2][breedte+2]==3) //links boven
					aantal++;
				if(array[lengte+1][breedte]==2&&array[lengte+2][breedte]==3) //rechts
					aantal++;
				if(array[lengte-1][breedte]==2&&array[lengte-2][breedte]==3) //links
					aantal++;
				if(array[lengte][breedte+1]==2&&array[lengte][breedte+2]==3) //boven
					aantal++;
				if(array[lengte][breedte-1]==2&&array[lengte+2][breedte+2]==3) //beneden
					aantal++;
			}
		}
	}

	cout<<aantal<<" keer 123.";
	getch();

}

alvast bedankt voor de hulp, het probleem zit bij het inlezen van het bestand, ik moet alle cijfers apart steken in een 2 dimensionele array..
 

Bijlagen

Je zou ook een array van strings kunnen gebruiken, en dan gewoon alle regels inlezen. (heb je eigenlijk ook een 2d-array)

Dat je programma blijft hangen is ergens wel logisch. Volgens mij is het niet mogelijk om het aantal '123's te vinden in één loop. Aangezien je loop aan een aantal dingen moet voldoen om het juiste aantal te vinden. Ik zal je een klein voorbeeldje geven:

Horizontaal:
Code:
    for(int   i = 0; i < AANTAL_REGELS; i++)
      for(int j = 0; j < AANTAL_REGELS-2; j++){   // j+2 
        if((char)INDEX[i][j] == '1' && (char)INDEX[i][j+1] == '2'  && (char)INDEX[i][j+2] == '3') aantal++;

Dit zoekt horizontaal van links naar rechts. Aangezien het een challenge voor net-force is zal ik je maar niet het antwoord geven. :P

edit:

Code:
	const int lengte=100, breedte=101;
	int array[lengte][breedte], aantal=0,c=0;

Het tekstbestand bestaat uit 100 regels van 100 karakters. Dus bovenstaande lijkt me ook niet te kloppen.


Code:
	for(int i=0; i<breedte; i++) //rij
	{
		for(int j=0; j<lengte; j++) //kolom
		{
			if(array[lengte][breedte]==1) //als er een 1 element wordt gevonden
			{
				if(array[lengte+1][breedte+1]==2&&array[lengte+2][breedte+2]==3) //rechts boven
					aantal++;
				if(array[lengte-1][breedte-1]==2&&array[lengte-2][breedte-2]==3) //links beneden
					aantal++;
				if(array[lengte+1][breedte-1]==2&&array[lengte+2][breedte-2]==3) //rechts beneden
					aantal++;
				if(array[lengte-1][breedte+1]==2&&array[lengte-2][breedte+2]==3) //links boven
					aantal++;
				if(array[lengte+1][breedte]==2&&array[lengte+2][breedte]==3) //rechts
					aantal++;
				if(array[lengte-1][breedte]==2&&array[lengte-2][breedte]==3) //links
					aantal++;
				if(array[lengte][breedte+1]==2&&array[lengte][breedte+2]==3) //boven
					aantal++;
				if(array[lengte][breedte-1]==2&&array[lengte+2][breedte+2]==3) //beneden
					aantal++;
			}
		}
	}

Hier maak je ook nog een fout. Je gebruikt array[lengte][breedte] terwijl je eigenlijk array[j] wilt gebruiken. Maar anders zou je programma nog vastlopen.
 
Laatst bewerkt:
thx

bedankt voor de goeie reactie, ik zal het even proberen zoals je zegt, ik zal wel nog laten weten of het gelukt is :p

edit: lol je kent net-force dus ook, bere sjiek, www.hackthissite.org is ook een aanrader!!
 
Laatst bewerkt:
Laat maar weten of het je gelukt is. Ik verwacht van wel, aangezien je al in de goede richting bezig was.
 
hmm, het is me toch nog niet helemaal duidelijk hoe ik het ga realiseren om een lijn in te lezen uit een tekstbestand, ik moet dus 100 lijnen inlezen maar hoe kan ik toch nog zorgen dat ze in m'n 2dim. array zitten?
Het probleem is wat dat ik niet echt veel ervaring heb met tekstbestanden, om een lijn in te lezen tot een enterteken of endline zou ik getline(cin, variabele) gebruiken
Kun je me mss nog een zetje in de goeie richting geven :D
 
't Inlezen is helemaal niet moeilijk hoor. Je maakt een array aan voor 100 regels.

Code:
string INDEX[100];

Voor het inlezen van de regels doe je gewoon iets als:

Code:
ifstream in;  string temp;  int teller = 0;
in.open("aap.txt");
while(!in.eof())
{
  getline(in, temp);
  INDEX[teller] = temp;
  teller++;
}

In bovenstaand voorbeeld heb ik geen rekening gehouden of aap.txt wel bestaat, en ook geen controle of teller lager dan of gelijk aan 100 is.

edit: op je vraag hoe je ze in een 2d-array kunt plaatsen. Dat is in bovenstaand voorbeeld al gedaan. Je kunt 'INDEX' nu aanspreken via -> INDEX[j];
 
Laatst bewerkt:
Hier ben ik weer :p

Ok, het 'zet text file in array' gedeelte is al gelukt. Maar bij het overgaan in de geneste forlus crasht het programma. Als ik debug geraak ik ook tot net ervoor. Ik drukte eens een element van de array af voor de lus en dat klopte. Ik vraag me echt af wat er nog mis kan zijn.

Source:
Code:
#include <iostream>
#include <fstream>
#include <stdio.h>
#include <conio.h>
using namespace std;

int main()
{
    ifstream in;
	const int lengte=100, breedte=100;
	int aantal=0;
	string array[100], temp;

    in.open ("aap.txt");
    
	if(in==NULL)
		cout<<"File kon niet worden geopend";
	else
	{
		for(int i=0; i<breedte; i++) //rij
		{
			  getline(in, temp);
              array[i] = temp;
		}
	}
		
    in.close();

	for(int i=0; i<breedte; i++) //rij
	{
		for(int j=0; j<lengte; j++) //kolom
		{	
				if((char)array[i][j] == '1' && (char)array[i+1][j+1] == '2'  && (char)array[i+2][j+2] == '3') aantal++; //rechts boven
				if((char)array[i][j] == '1' && (char)array[i-1][j-1] == '2'  && (char)array[i-2][j-2] == '3') aantal++; //links beneden
				if((char)array[i][j] == '1' && (char)array[i+1][j-1] == '2'  && (char)array[i+2][j-2] == '3') aantal++; //links boven
				if((char)array[i][j] == '1' && (char)array[i-1][j+1] == '2'  && (char)array[i-2][j+2] == '3') aantal++; // rechts beneden
				if((char)array[i][j] == '1' && (char)array[i+1][j] == '2'  && (char)array[i+2][j] == '3') aantal++; //rechts
				if((char)array[i][j] == '1' && (char)array[i-1][j] == '2'  && (char)array[i-2][j] == '3') aantal++; //links
				if((char)array[i][j] == '1' && (char)array[i][j+1] == '2'  && (char)array[i][j+2] == '3') aantal++; //boven
				if((char)array[i][j] == '1' && (char)array[i][j-1] == '2'  && (char)array[i][j-2] == '3') aantal++; //beneden
		}
	}

	cout<<aantal<<" keer 123";
	getch();

}

edit: debugger zegt an access violation raised in your program
 
Laatst bewerkt:
Code:
	for(int i=0; i<breedte; i++) //rij
	{
		for(int j=0; j<lengte; j++) //kolom
		{	
				if((char)array[i][j] == '1' && (char)array[i+1][j+1] == '2'  && (char)array[i+2][j+2] == '3') aantal++; //rechts boven
				if((char)array[i][j] == '1' && (char)array[i-1][j-1] == '2'  && (char)array[i-2][j-2] == '3') aantal++; //links beneden
				if((char)array[i][j] == '1' && (char)array[i+1][j-1] == '2'  && (char)array[i+2][j-2] == '3') aantal++; //links boven
				if((char)array[i][j] == '1' && (char)array[i-1][j+1] == '2'  && (char)array[i-2][j+2] == '3') aantal++; // rechts beneden
				if((char)array[i][j] == '1' && (char)array[i+1][j] == '2'  && (char)array[i+2][j] == '3') aantal++; //rechts
				if((char)array[i][j] == '1' && (char)array[i-1][j] == '2'  && (char)array[i-2][j] == '3') aantal++; //links
				if((char)array[i][j] == '1' && (char)array[i][j+1] == '2'  && (char)array[i][j+2] == '3') aantal++; //boven
				if((char)array[i][j] == '1' && (char)array[i][j-1] == '2'  && (char)array[i][j-2] == '3') aantal++; //beneden
		}
	}

Je maakt hier weer dezelfde fout als ik al aangehaald heb. Misschien ben ik niet duidelijk genoeg geweest.

Dat je programma blijft hangen is ergens wel logisch. Volgens mij is het niet mogelijk om het aantal '123's te vinden in één loop. Aangezien je loop aan een aantal dingen moet voldoen om het juiste aantal te vinden. Ik zal je een klein voorbeeldje geven:

Als je wilt zoeken op array[j] [...] array[j+2], dan wil je dus dat de variabele j met 2 verhoogd wordt. Maar dat is onmogelijk binnen jouw code.

Code:
	for(int i=0; i<breedte; i++) //rij
	{
		for(int j=0; j<lengte; j++) //kolom
		{

Stel je voor dat de variabele 'j' gelijk is aan 100. Als je dan 'j+2' doet wordt de variabele j 102. Bestaat INDEX[102] ? Volgens mij niet :P

Je zult dus het zoeken naar de '123's moeten verdelen onder bepaalde functies. (bijvoorbeeld onder zoek_horizontaal, zoek_verticaal en zoek_diagonaal; (diagonaal kan ook weer niet binnen één loop))

Ik hoop dat je iets met bovenstaande kunt. Succes.
 
Laatst bewerkt:
ah ja, logisch dat dat niet gaat, kverstond eerst niet wat je wilde zeggen maar met je voorbeeldje wel
nu zou ik het moeten vinden, thx voor alles, al veel geleerd
 
Succes. Mocht het niet lukken dan horen we dat vanzelf wel.
 
Status
Niet open voor verdere reacties.
Terug
Bovenaan Onderaan