Search code examples
c#xamarin.formsstreamreaderstreamwriter

Why does text written to a file via StreamWriter not get saved when page is reloaded? (Xamarin)


I'm trying to write multiple strings to a txt file in order to save that information when the user switches pages. However, the strings seem to never be saved.

Entry. (source of strings to write to file)

<Entry 
x:Name="Entry"
Placeholder="Username"
WidthRequest = "200"
VerticalOptions = "Start"
HorizontalOptions = "Center"
/>

Code to write information to file.

        private void Write()
        {

            StreamWriter sw = new StreamWriter(path);
            sw.WriteLine(txtStorage.Length);

            //Writes length so that txtStorage can be correct length later

            sw.WriteLine(Entry.Text);

            //Writes username entered in this instance of the page

            for (int i = 0; i < txtStorage.Length; i++)
            {
                sw.WriteLine(txtStorage[i]);

                //Writes usernames stored from previous instances
            };
            sw.Close();
        } 

Code to read file.

        {
            StreamReader sr = new StreamReader(path);
            txtStorage = new string[Convert.ToInt32(sr.ReadLine())];

            //updates txtstorage to new length written in text file

            for (int i = 0; i < txtStorage.Length; i++)
            {
                txtStorage[i] = sr.ReadLine();
                //puts all usernames back into txtstorage
            };

            sr.Close();
        } 

All usernames from previous instances are not saved. What am I doing wrong?


Solution

  • when you write the file, you are doing this

    // 1. write the length of the array
    sw.WriteLine(txtStorage.Length);
    
    // 2. write the user name
    sw.WriteLine(Entry.Text);
    
    // 3. write the array
    for (int i = 0; i < txtStorage.Length; i++)
    

    this will generate a file something like this

    3
    myusername
    user1
    user2
    user3
    

    then when you read the file, you are doing this

    // 1. read the length as a string
    txtStorage = new string[Convert.ToInt32(sr.ReadLine())];
    
    // 2. you aren't doing anything to handle line #2
    
    // 3. you are using the LENGTH of txtstorage, which is 1, so your loop is only executing once
    // and since you skipped #2, you are also starting on the wrong line
    for (int i = 0; i < txtStorage.Length; i++)
    

    instead, do this

    // 1. read the length as an int
    var ndx = int.Parse(sr.ReadLine());
    
    // 2. read the user name
    var user = sr.ReadLine();
    
    // 3. use ndx as the loop counter, starting on the correct line
    for (int i = 0; i < ndx; i++)