Błedy w programie napisanym w c++?


(karton16) #1

Witam

Mam napisać program , który zapisuje do pliku reprezentację binarną liczb całkowitych zawartych w dane.txt (liczby dziesiętne nie przekraczające 255)

Ja sam spróbowałem go napisać i wygląda następująco:

#include 

#include 

#include 

#include 

#include 

using namespace std;


int main()

{

    ifstream plik1;

    ofstream plik2;


    plik1.open("dane.txt");

    plik2.open("reprezentacja binarna.txt");


    if(plik1.good() && plik2.good())

    {

    	do

    	{

    		int a;

        int b = 256;


        plik1 >> a;

        if(a <= 256)

        {

        	for(int i = 0; i<=8;i++)

         {

         	if(b !=1)

         {

		 if(a - b >= 0 )

         	{

         		plik2 << "1";

         		b=b/2;

		}

		else

		{

			plik2 << "0";

         		b=b/2;

		}

     }

     else

     {

     	if(a - b == 0)

     	{

     		plik2 << "1";

     	}

     	else

     	{

     		plik2 << "0";

     	}

     }

     plik2 << endl;

         }


        }

        while(!plik1.eof());

    	}

    }

    	plik1.close();

    plik2.close();


}

Mój problem polega na tym, że mam błąd przy kompilacji :

C:\Documents and Settings\Adrian\Pulpit\BezNazwy1.cpp In function 'int main()':

58 5 C:\Documents and Settings\Adrian\Pulpit\BezNazwy1.cpp [Error] expected 'while' before '}' token

58 5 C:\Documents and Settings\Adrian\Pulpit\BezNazwy1.cpp [Error] expected '(' before '}' token

58 5 C:\Documents and Settings\Adrian\Pulpit\BezNazwy1.cpp [Error] expected primary-expression before '}' token

58 5 C:\Documents and Settings\Adrian\Pulpit\BezNazwy1.cpp [Error] expected ')' before '}' token

58 5 C:\Documents and Settings\Adrian\Pulpit\BezNazwy1.cpp [Error] expected ';' before '}' token

Czy mógłby ktoś pomóc mi w odnalezieniu tego błędu i czy ten program na pewno dobrze działa.


(Rst00) #2

Popracuj nad wcięciami bo ciężko się połapać na pierwszy rzut oka. Tutaj masz poprawiony kod. Nie testowałem, ale powinien działać.

#include 

#include 

#include 

#include 

#include 

using namespace std;


int main()

{

    ifstream plik1;

    ofstream plik2;


    plik1.open("dane.txt");

    plik2.open("reprezentacja binarna.txt");


    if(plik1.good() && plik2.good())

    {

       do

       {

			int a;

			int b = 256;


			plik1 >> a;


			if(a <= 256)

			{

				for(int i = 0; i<=8;i++)

				{

					if(b !=1)

					{

						if(a - b >= 0 )

						{

							plik2 << "1";

							b=b/2;

						}

						else

						{

							plik2 << "0";

							b=b/2;

						}

					}

					else

					{

						if(a - b == 0)

						{

							plik2 << "1";

						}

						else

						{

							plik2 << "0";

						}

					}

				plik2 << endl;

				} 

			}

       } while(!plik1.eof());

    }


	plik1.close();

    plik2.close();


}

(karton16) #3

Wielkie dzięki teraz już działa. Jesteś wielki!

A możesz mi powiedzieć gdzie był ten błąd?


(Rst00) #4

Miałeś nie za tym nawiasem klamrowym co trzeba.


(karton16) #5

Acha. Jeszcze raz wielkie dzięki :smiley:


(etam) #6

Takie wczytywanie danych jest prostsze:

ifstream plik1("dane.txt");


int a;

while(plik1 >> a) {

    //przetwarzanie

}

1)

ifstream plik1;

plik1.open("dane.txt");

jest równoważne z

ifstream plik1("dane.txt");

2) operator >> dla strumieni zwraca referencję do tego samego strumienia (dlatego można robić "plik >> a >> b >> c" co jest równoważne z "((plik >> a) >> b) >> c"). Strumienie mają też przeciążony operator konwersji na bool. W skrócie: "while(plik1 >> a) { ... }" oznacza "dopóki coś się poprawnie wczytało z pliku, to rób coś w pętli".

3) Destruktor strumieni plikowych automatycznie zamyka plik. Nie trzeba wywoływać close(). (Patrz: RAII)


(karton16) #7

Ach też już o tym słyszałem. Tylko nie jestem pewny, czy ten program poprawnie działa