Bruno Earth Ответов: 3

Как написать текст в определенной строке, не перезаписывая текущий текст с помощью C#?


Я пытался писать новые тексты в определенной строке, не полностью перезаписывая текущее содержимое файла, но, похоже, не могу заставить его работать. Например, в моем файле под названием Test.txt, это то, что в настоящее время написано в нем:

1
2
3
4

8
9
10

Как вы, возможно, заметили, я не включил числа 5,6 и 7. Есть также место, куда можно вставить 5,6 и 7. Но когда я попытался вставить эти цифры, это дало мне такой результат:

1
2
3
4

8
9
101
2
3
4

5
6
7

Он явно добавил кучу цифр, которые мне совсем не нужны. Код для этого указан ниже. Надеюсь, вы, ребята, поможете мне в этом деле.

Что я уже пробовал:

namespace TestCode
{
    class Program2
    {
        static void Main()
        {

            var lines = System.IO.File.ReadAllLines(@"C:\Users\User1\Documents\Visual Studio 2015\WebSites\MusicStore\Pages\Test.txt");
            lines[5] = "5";
            lines[6] = "6";
            lines[7] = "7";
            System.IO.File.AppendAllLines(@"C:\Users\User1\Documents\Visual Studio 2015\WebSites\MusicStore\Pages\Test.txt", lines);

            

        }
    }
}

[no name]

"AppendAllLines", как вы думаете, что именно означает" append"?

3 Ответов

Рейтинг:
2

Midi_Mick

Ваша проблема в том AppendAllLines Этот метод добавляет все, что вы пишете, в конец файла. Воспользуйся WriteAllLines вместо.

Кроме того, ваша вставка строк-это замена. Есть несколько способов исправить это. Ты можешь
1. Используйте список вместо массива и вставьте строки в соответствующее место.
2. Создайте новый массив с правильным количеством строк и скопируйте прочитанные значения в нужные места.
3. Набор линий[4] = "5" окружающая среда+.Новая Строка + "6" + Окружающая Среда.Новая Строка + "7" + Окружающая Среда.Строки

** Примечание - индексы строк должны быть равны нулю, поэтому они на 1 меньше числа, которое у вас есть в строке.


Afzaal Ahmad Zeeshan

5ед.

Что касается варианта 1, то он также может добавить элементы в любое место, а затем, наконец, просто отсортировать массив. Вставка каждого элемента займет одинаковое количество времени.

[no name]

приведение реального примера гораздо лучше для меня, чтобы понять. К сожалению, я все еще новичок в кодировании.

Рейтинг:
15

Afzaal Ahmad Zeeshan

Как уже упоминалось NotPoliticallyCorrect в комментарии к вашему вопросу, AppendAllLines будет только добавлять список к вашим текущим данным. Ни больше, ни меньше.

Для того чтобы добавить 5,6,7 (к текущим данным и применимым только к этому сценарию), вам также необходимо позже отсортировать данные. Эта сортировка данных расположит строки соответствующим образом.

// read the data
var lines = File.ReadAllLines("path");
var _lines = new List<string>(lines); // string[] to List<string>

_lines.Add("5");
_lines.Add("6");
_lines.Add("7");
lines = _lines.ToArray(); // Come back.

// sort
Array.Sort(lines);

// Write the data
File.WriteAllLines("path", lines);

Это будет записывать данные в последовательности. Вы также можете рассмотреть возможность использования LINQ здесь, что даст лучшую читабельность кода, но это потребует немного больше усилий, чтобы заставить код работать.

Еще одна вещь, поскольку данные имеют строковый тип, сортировка будет выглядеть как "1, 10, 2...", а не как, "1, 2,... 10", чтобы использовать более поздний вариант, вам нужно привести данные к целому числу, а затем отсортировать их. Для этого вам следует посмотреть на, Convert.ToInt32() метод и используйте его для преобразования списка в целые числа перед сортировкой.

Для примера, пожалуйста, посмотрите здесь, Главная | .Чистая Скрипка[^]


[no name]

код работает нормально, но что делать, если я не хочу его сортировать?. Потому что, честно говоря, я просто использовал числа в качестве примера, и я действительно не собираюсь сортировать числа. Моя главная цель-вставить числа 5, 6 и 7 прямо через пробел, который был указан в моем посте выше, не переписывая 8,9,10. Я попытался удалить часть кода сортировки, но она перезаписывает 8,9 и 10.

Afzaal Ahmad Zeeshan

Затем вам нужно будет передать индекс, а затем использовать _list.Insert(6, "5") вместо того чтобы Add функция. Это даст вам возможность добавить определенный индекс, а остальная часть кода останется такой, какая она есть.

Преимущество использования списка над статическим массивом заключается в том, что для обновления или изменения массива, например в случаях добавления или удаления элементов, требуется много хорошей логики для добавления элементов или удаления узла. В списке это автоматически управляется внутренне.

Подробнее о Список.Вставить сюда.

[no name]

Теперь он работает. Большое вам спасибо!

Рейтинг:
0

Patrice T

Когда вы не понимаете, что делает ваш код или почему он делает то, что делает, ответ таков: отладчик.
Используйте отладчик, чтобы увидеть, что делает ваш код. Он позволяет вам выполнять строки 1 на 1 и проверять переменные по мере их выполнения, это невероятный инструмент обучения.

Отладчик-Википедия, свободная энциклопедия[^]
Освоение отладки в Visual Studio 2010 - руководство для начинающих[^]

Отладчик здесь для того, чтобы показать вам, что делает ваш код, и ваша задача-сравнить его с тем, что он должен делать.
В отладчике нет никакой магии, он не находит ошибок, он просто помогает вам. Когда код не делает того, что ожидается, вы близки к ошибке.


[no name]

спасибо за совет.