Может кто-нибудь объяснить это явление при перезаписи первой строки текстового файла? - PullRequest
0 голосов
/ 16 декабря 2018

Я работаю над проектом, в котором пользователь может просматривать фразы предложений и выбирать конкретное значение конкретного слова в предложении (лучший способ его описать).Часть того, что мне нужно сделать, это сохранить индекс текущего выбранного предложения, чтобы при повторном открытии программы пользователь мог вернуться с того места, где он остановился.Это было легко.

Однако у меня возникла проблема при попытке перезаписать первую строку файла, который сохраняет свою работу (он содержит индекс последнего просмотренного предложения), а именно, что он удаляет следующую строку (частично или иначе).Лучшее (то есть единственное) решение, которое я нашел до сих пор, - переписать весь файл, но я все еще хотел бы знать, что происходит под капотом.

По сути, сначала я написал следующее в текстовый файл:

Andrew
ate
breakfast

Затем я переписал первую строку с помощью Andrew 122 с помощью WriteLine и получил следующее:

Andrew 122
breakfast

Используя Write, я получил это:

Andrew 122e
breakfast

Есть ли кто-нибудь, кто может объяснить мне, что происходит?

(для справки, вот код, который я использовал дляпроверить это:

    static void Main(string[] args)
    {
        string path = String.Format(@"C:\Users\User\Desktop\{0} Project\test.txt", @"C#");
        if (File.Exists(path))
            File.Delete(path);

        WriteToFile(path, true, "Andrew", "ate", "breakfast");
        WriteToFile(path, false, "Andrew 122");
    }

public static void WriteToFile(string path, bool newLine, params string[] line)
    {
        using (FileStream fStream = new FileStream(path, FileMode.OpenOrCreate, FileAccess.Write))
        using (StreamWriter fWriter = new StreamWriter(fStream, Encoding.UTF8))
            for (int i = 0; i < line.Length; i++)
                if (newLine)
                    fWriter.WriteLine(line[i]);
                else
                    fWriter.Write(line[i]);
    }

1 Ответ

0 голосов
/ 16 декабря 2018

«Феномен» заключается в том, что вы думаете о файле в человеческих терминах, где вы видите разрывы строк, но StreamWriter работает с байтами.Изначально у вас есть эта серия байтов (обратите внимание на возврат каретки и новую строку):

[A][n][d][r][e][w][\r][\n][a][t][e][\r][\n][b][r][e][a][k][f][a][s][t]

Затем вы перезаписываете байты 7-10 с помощью «122»

[A][n][d][r][e][w][  ][ 1][2][2][e][\r][\n][b][r][e][a][k][f][a][s][t]
...