user3461835
user3461835

Reputation: 11

Write and Read an Array to a Binary File

I have an array consisting of 1 string value and 2 int values, which I would like to write to a binary file.

It consists of name, index and score.

I have attached the array code below, how could I write this to a file?

Player[] playerArr = new Player[10];
        int index = 0;
        index = index + 1;                                  // when a new player is added the index is increased by one
        Player p = new Player(txtName3.Text, index, Convert.ToInt16(txtScore.Text));    // set the values of the object p
        p.refName = txtName3.Text;                          // set refName to be the string value that is entered in txtName
        p.refTotalScore = Convert.ToInt16(txtScore.Text);
        playerArr[index] = p;                               // set the p object to be equal to a position inside the array

I would also like to sort each instantiation of the array to be output in descending order of score. How could this be done?

The file handling code I have so far is:

    private static void WriteToFile(Player[] playerArr, int size)
    {
        Stream sw;
        BinaryFormatter bf = new BinaryFormatter();

        try
        {
            sw = File.Open("Players.bin", FileMode.Create);
            bf.Serialize(sw, playerArr[0]);
            sw.Close();
            sw = File.Open("Players.bin", FileMode.Append);
            for (int x = 1; x < size; x++)
            {
                bf.Serialize(sw, playerArr[x]);
            }
            sw.Close();
        }
        catch (IOException e)
        {
            MessageBox.Show("" + e.Message);
        }
    }

    private int ReadFromFile(Player[] playerArr)
    {
        int size = 0;
        Stream sr;
        try
        {
            sr = File.OpenRead("Players.bin");
            BinaryFormatter bf = new BinaryFormatter();
            try
            {
                while (sr.Position < sr.Length)
                {
                    playerArr[size] = (Player)bf.Deserialize(sr);
                    size++;
                }
                sr.Close();
            }
            catch (SerializationException e)
            {
                sr.Close();
                return size;
            }
            return size;
        }
        catch (IOException e)
        {
            MessageBox.Show("\n\n\tFile not found" + e.Message);
        }
        finally
        {
            lstLeaderboard2.Items.Add("");
        }
        return size;
    }

Upvotes: 1

Views: 1105

Answers (1)

Neil T
Neil T

Reputation: 3285

For the first part, you need to mark your class as Serializable, like this:

    [Serializable]
    public class Player

It's fine to Append to a new file, so you can change your code to this:

    sw = File.Open(@"C:\Players.bin", FileMode.Append);
    for (int x = 0; x < size; x++)
    {
        bf.Serialize(sw, playerArr[x]);
    }
    sw.Close(); 

(with the appropriate exception handling, and you'll obviously need to amend this if the file might already exist).

For the second part, you can sort an array like this using LINQ:

var sortedList = playerArr.OrderBy(p => p.Score);

If you require an array as output, do this:

var sortedArray = playerArr.OrderBy(p => p.Score).ToArray();

(Here, Score is the name of the property on the Player class by which you want to sort.)

If you'd like any more help, you'll need to be more specific about the problem!

Upvotes: 1

Related Questions