Pomoc z odczytem i zapisem do pliku


(Gigakropa) #1
#include

#include

#include 

#include 

#include 


struct WYNIKI

{

	char W_nick[10];

	int W_wygrana;

};


int main ()

{

/*Tu odbywa się cała gra, która działa dobrze. Używam z niej dla potrzeb listy tylko wskaźnika int *WSK_KREDYT

  który wskazuje na wynik aktualnego gracza. Mogę go wrzucić ale jest dość długi :D */

WYNIKI zawodnik[100]; // start zabawy z lista

	Licznik = 0;

	odczytaj(zawodnik, Licznik);

if(Licznik>100-1) 

		{

			czyszczenie();

			Licznik = 0;

		    cout << "NIE MOZNA DODAC WIECEJ GRACZY, RESETOWANIE PAMIECI " << endl; // czyszczenie

		};

        cout << endl << " Podaj swoj nick[max10] : ";

        cin >> zawodnik[Licznik].W_nick;

	zawodnik[Licznik].W_wygrana = *WSK_KREDYT;

	zapisz(zawodnik, Licznik);

	pokaz(zawodnik, Licznik);

getch();

}

void pokaz(WYNIKI gracz[], int n)

  {

  int i;

  cout << "Lista graczy" << endl;

  for(i=0; i
    {

    cout << i+1 << ". " << gracz[i].W_wygrana << " " << gracz[i].W_nick[10] << endl;

    }

  }


void czyszczenie()

{

	ofstream lista_wy;

	lista_wy.open("lista.txt");

	lista_wy.clear();

	lista_wy.close();

}

void zapisz(WYNIKI gracz[], int n)

  {

  int i;

  ofstream lista_wy;

  lista_wy.open("lista.txt");

  if(lista_wy.is_open())

    {

    for(i=0; i
      {

      //wygrana w pierwsze linii

      lista_wy << gracz[i].W_wygrana << endl;

      //nick w drugiej 

      lista_wy << gracz[i].W_nick << endl;

      };

    lista_wy.close();

    }

  }


void odczytaj(WYNIKI gracz[], int &n)

  {

  ifstream lista_we;

  n=0;

  lista_we.open("lista.txt");

  if(lista_we.is_open())

  {

    while(!lista_we.eof())

      {

      lista_we >> gracz[n].W_wygrana;

      lista_we >> gracz[n].W_nick;    

      if(lista_we.fail()) break; //jesli byl blad to konczymy odczyt

      n++;

      if(n>100-1) break; // na MAX

      }

    lista_we.close();

    }

  }

Program jest wstanie odczytać tylko dane liczbowe typu int resztę widzi jako dość dziwny znak coś ala znak ¶ tylko odwrotny

i przypisuje nowego gracz (nick i *WSK_KREDYT) dziwne wartości np -1 "znak" -1 czy 10 "znak"; :o .

Skończyły mi się już pomysły i znow jestem zmuszony skrzystać z Waszej wiedzy [-o<

Z góry dzięki


(Sawyer47) #2

Nie wczytuje się operatorem >> danych do tablic. Albo użyjesz klasy std::string albo zmienisz sposób wczytywania danych do pola W_nick. Możesz użyć metod get/getline.


(Gigakropa) #3
struct WYNIKI

{

	std::string W_nick[10];

	int W_wygrana;

};


void odczytaj(WYNIKI gracz[], int &n)

  {

  ifstream lista_we;

  n=0;

  lista_we.open("lista.txt");

  if(lista_we.is_open())

  {

    while(!lista_we.eof())

      {

	  lista_we >> gracz[n].W_wygrana; -- >> wysypuje sie

	  lista_we >> gracz[n].W_nick; -- >> wysypuje sie

      if(lista_we.fail()) break; //jesli byl blad to konczymy odczyt

      n++;

      if(n>100-1) break; // na MAX

      }

    lista_we.close();

    }

  }

Wyskakuje komunikat "Debug Assertion Failed"; Expression: string subscript out of rang -->> Nie kumam czemu poza zasiegiem

struct WYNIKI

{

	char W_nick[10]; // -->> zostaje char

	int W_wygrana;

};


void odczytaj(WYNIKI gracz[], int &n)

  {

  ifstream lista_we;

  n=0;

  lista_we.open("lista.txt");

  if(lista_we.is_open())

  {

    while(!lista_we.eof())

      {

		  lista_we.getline(cin, gracz[n].W_wygrana);// -->> blad

		  lista_we.getline(cin, gracz[n].W_nick);// -->> blad

      if(lista_we.fail()) break; //jesli byl blad to konczymy odczyt

      n++;

      if(n>100-1) break; // na MAX

      }

    lista_we.close();

    }

  }

Wyskakuje

error C2664: 'std::basic_istream<_Elem,_Traits> &std::basic_istream<_Elem,_Traits>::getline(_Elem *,std::streamsize)' : cannot convert parameter 1 from 'std::istream' to 'char *' -- >> Tylko co zamieniam istream na char. Przypuszczam, ze coś mam nie tak za składnia getline();

Może to problem ze środowiskiem. Kompiluje w MS Visual Studio C++ 2008


(Sawyer47) #4

Trzeba jeszcze myśleć. "std::string W_nick[10];" to nadal tablica, a do tablic się nie wczytuje operatorem>>. Jeśli chcesz mieć napis to wystarczy 1 obiekt std::string. Po drugie taka zmiana zazwyczaj pociągnie za sobą zmianę innych fragmentów kodu.

Jeśli natomiast zostajesz przy 10-znakowym buforze to trzeba podać ograniczenie do funkcji getline, inaczej będzie pisała dalej do pamięci do zaowocuje losowymi, ale zawsze zlymi wynikami. Zobacz tu: http://www.cppreference.com/wiki/io/getline

Czemu wysyłasz jako char* buffer obiekt std::cin, a jako liczbę bajtów do wczytania wysyłasz tablicę znaków? Bez sensu.


(Gigakropa) #5
struct WYNIKI

{

   std::string W_nick; --- >> Moje nie dopatrzenie przy kopiowaniu :D 

   int W_wygrana;

};


void odczytaj(WYNIKI gracz[], int &n)

  {

  ifstream lista_we;

  n=0;

  lista_we.open("lista.txt");

  if(lista_we.is_open())

  {

    while(!lista_we.eof())

      {

     lista_we >> gracz[n].W_wygrana; -- >> nie przypisuje

     lista_we >> gracz[n].W_nick; -- >> nie przypisuje

      if(lista_we.fail()) break; //jesli byl blad to konczymy odczyt

      n++;

      if(n>100-1) break; // na MAX

      }

    lista_we.close();

    }

  }

Kompiluje się tylko nie przypisuje mi wartości. Chyba oleje temat by widzę, że porywam się z motyką na słońce. Trzeba przeczytać jakąś dobrą książkę na ten temat.

Być może posiada ktoś z was kod programu który zapisywał by do pliku dwie dane (jedną liczbę(int) i drugą nazwę(string czy cha[10])), przy następnym uruchomieniu programu odczytywał je dopisał 1 nową i zapisał znowu (max 100 rekordów). (chodzi o czas mam tydzień na oddanie pracy :? ).

-- Dodane 07.06.2009 (N) 16:04 --

Już działam

Zapomniałem napisać Licznik ++ :glupek2: :glupek2: :glupek2: :glupek2: :glupek2:

Co prawda w dev cpp ale może byc.