Postaram się.
Programik ten ma na celu zapis do pliku informacji czy gracz wygrał, przegrał czy poddał grę.
Po zapisie odczytuję zawartość (tak jak na lekcji).
Aktualizacja pliku następuje po każdej grze. Zapisywane są tylko takie informacje: Nazwa Gracza, Ilość gier, Ile wygrał, Ile przegrał, Ile poddał.
Początkowo chciałem zapisywać jeszcze datę ostatniej gry lecz w programie jest trochę innych bardziej istotnych błędów więc zrezygnowałem.
Wynik działania diametralnie odbiega od oczekiwań:
Po otwarciu pliku, zapis widnieje w jednej linii a nie tak jak jest zaprezentowane na lekcji w kilku wierszach
błędnie wyliczana jest ilość rekordów. Wg programu jest 3 a nie 4.
błędnie wylicza RAF.length() . Wg programu RAF.length() = 176 //Nie wiem skąd to bierze?.
Przerabiałem lekcję 8-smą (Strumienie) i wszystko było ok.
Teraz muszę robić jakiś błąd lecz nie wiem co. Jeżeli nie sprawi to zbytnio kłopotu to prosiłbym o pomoc.
Klasa
Statystyka :
- Kod: Zaznacz cały
package statystyka;
import java.io.*;
public class Statystyka {
public static void main(String[] args) {
zapisGry[] zapG = new zapisGry[4];
zapG[0] = new zapisGry("Witek", 1, 0, 1, 0);
zapG[1] = new zapisGry("Jacek", 2, 1, 1, 0);
zapG[2] = new zapisGry("Jorek", 3, 2, 1, 0);
zapG[3] = new zapisGry("Piotr", 1, 1, 3, 0);
try
{
RandomAccessFile RAF = new RandomAccessFile("baza.txt", "rw");
RAF.seek(0);
zapisGry.zapiszDoPliku(zapG, RAF);
RAF.seek(0);
zapisGry[] infOGrze = zapisGry.odczytajZPliku(RAF);
for(int i=0; i<infOGrze.length; i++)
{
System.out.println(infOGrze[i].pobierzNazweGracza());
System.out.println(infOGrze[i].pobierzLiczbeGier());
System.out.println(infOGrze[i].pobierzLiczbeWygranychGier());
System.out.println(infOGrze[i].pobierzLiczbePrzegranychGier());
System.out.println(infOGrze[i].pobierzLiczbePoddanychGier());
System.out.println("-----------------------");
}
try
{
zapisGry b = new zapisGry();
b.czytajRekord(RAF, 3);
//System.out.println(b);
b.czytajDane(RAF);
//System.out.println("lala");
}
catch(BrakRekordu err)
{
System.out.println(err.getMessage());
}
RAF.close();
}
catch(IOException e)
{
System.out.println(e.getMessage());
}
}
}
Klasa
zapisGry :
- Kod: Zaznacz cały
package statystyka;
import java.io.*;
public class zapisGry {
public zapisGry()
{
this.nazwaGracza = " ";
this.liczbaGier = 0;
this.wygral = 0;
this.przegral = 0;
this.poddal = 0;
}
public zapisGry(String nazwaGracza, int liczbaGier, int wygral, int przegral, int poddal) //, int rokOd, int mmOd, int dzOd, int rokDo, int mmDo, int dzDo)
{
this();
this.nazwaGracza = nazwaGracza;
this.liczbaGier = liczbaGier;
this.wygral = wygral;
this.przegral = przegral;
this.poddal = poddal;
}
public String pobierzNazweGracza()
{
return this.nazwaGracza;
}
public int pobierzLiczbeGier()
{
return this.liczbaGier;
}
public int pobierzLiczbeWygranychGier()
{
return this.wygral;
}
public int pobierzLiczbePrzegranychGier()
{
return this.przegral;
}
public int pobierzLiczbePoddanychGier()
{
return this.poddal;
}
public static void zapiszDoPliku(zapisGry[] zapG, DataOutput outS) throws IOException
{
//System.out.println("zapG.length= "+zapG.length);
for(int i=0; i<zapG.length; i++)
{
zapG[i].zapiszDane(outS);
}
}
public void zapiszDane(DataOutput outS) throws IOException
{
//StringBuffer stringB = new StringBuffer(zapisGry.DLUGOSC_NAZWY_GRACZA);
StringBuilder stringB = new StringBuilder(zapisGry.DLUGOSC_NAZWY_GRACZA);
stringB.append(this.nazwaGracza);
stringB.setLength(zapisGry.DLUGOSC_NAZWY_GRACZA);
outS.writeChars(stringB.toString()); // zapis nazwy gracza do pliku
//System.out.println("W nazwaGracza"+stringB.toString());
outS.write(this.liczbaGier); // zapis liczby gier w których uczestniczył gracz
//System.out.println("W liczbaGier"+this.liczbaGier);
outS.write(this.wygral); // zapis liczby wygranych gier
//System.out.println("W wygral"+this.wygral);
outS.write(this.przegral); // zapis liczby przegranych gier
//System.out.println("W przegral"+this.przegral);
outS.write(this.poddal); // zapis liczby poddanych gier
//System.out.println("W poddal"+this.poddal);
}
public void czytajDane(DataInput inS) throws IOException
{
//StringBuffer tString = new StringBuffer(zapisGry.DLUGOSC_NAZWY_GRACZA);
StringBuilder tString = new StringBuilder(zapisGry.DLUGOSC_NAZWY_GRACZA);
for(int i=0; i<zapisGry.DLUGOSC_NAZWY_GRACZA; i++)
{
char tCh = inS.readChar();
if (tCh != '\0')
tString.append(tCh);
}
this.nazwaGracza = tString.toString();
this.liczbaGier = inS.readInt();
this.wygral = inS.readInt();
this.przegral = inS.readInt();
this.poddal = inS.readInt();
} // end-czytajDane
public static zapisGry[] odczytajZPliku(RandomAccessFile RAF) throws IOException
{
int ilRekordow = (int)(RAF.length()/zapisGry.DLUGOSC_REKORDU);
// System.out.println("WM ilRekordow= "+ilRekordow);
zapisGry[] zapG = new zapisGry[ilRekordow];
for(int i=0; i<ilRekordow; i++)
{
zapG[i] = new zapisGry();
zapG[i].czytajDane(RAF);
}
return zapG;
}
public void czytajRekord(RandomAccessFile RAF, int n) throws IOException, BrakRekordu
{
System.out.println("czytajRekord/RAF.LENGTH= "+RAF.length());
if(n<=RAF.length()/zapisGry.DLUGOSC_REKORDU)
{
RAF.seek((n-1)*zapisGry.DLUGOSC_REKORDU);
this.czytajDane(RAF);
}else
{
throw new BrakRekordu("Nie ma takiego rekordu!");
}
}
public static final int DLUGOSC_NAZWY_GRACZA = 20;
public static final int DLUGOSC_REKORDU = (Character.SIZE * DLUGOSC_NAZWY_GRACZA + 4*Integer.SIZE)/8;
private String nazwaGracza; // identyfikator gracza
private int liczbaGier; // w ilu grach gracz uczestniczyl
private int wygral; // liczba wygranych gier
private int przegral; // liczba przegranych gier
private int poddal; // liczba poddanych gier
}
Klasa
brakRekordu :
- Kod: Zaznacz cały
package statystyka;
public class BrakRekordu extends Exception
{
public BrakRekordu()
{
super();
}
public BrakRekordu(String error)
{
super(error);
}
}
Wynik :
- Kod: Zaznacz cały
run:
Lenght= 3
DLUGOSC_NAZWY_GRACZA= 20
DLUGOSC_REKORDU= 56
Character.SIZE= 16
Integer.SIZE= 32
RAF.LENGTH 1= 176
Witek
16777472
4849761
6488165
7012352
-----------------------
ȁĀJore
7012352
0
0
0
-----------------------
̂ĀPiotr
0
0
0
0
-----------------------
czytajRekord/RAF.LENGTH= 176
null
BUILD SUCCESSFUL (total time: 0 seconds)
Zawartość pliku
baza.txt :
- Kod: Zaznacz cały
W i t e k J a c e k J o r e k P i o t r