С# добавить номера строк в текстовый файл

Я пытаюсь прочитать текстовый файл на С# и добавить номера строк к строкам.

Это мой входной файл:

    This is line one
    this is line two
    this is line three

И это должно быть на выходе:

    1 This is line one
    2 this is line two
    3 this is line three

Это мой код до сих пор:

class Program
{
    public static void Main()
    {
        string path = Directory.GetCurrentDirectory() + @"\MyText.txt";

        StreamReader sr1 = File.OpenText(path);

        string s = "";

        while ((s = sr1.ReadLine()) != null)           
        {
            for (int i = 1; i < 4; i++)
                Console.WriteLine(i + " " + s);
            }

            sr1.Close();
            Console.WriteLine();    
            StreamWriter sw1 = File.AppendText(path);
            for (int i = 1; i < 4; i++)
            {
                sw1.WriteLine(s);
            }

            sw1.Close();               
    }
}

Я на 90% уверен, что мне нужно использовать цикл, чтобы получить номера строк, но пока с этим кодом я получаю этот вывод в консоли:

1 This is line one
2 This is line one
3 This is line one
1 this is line two
2 this is line two
3 this is line two
1 this is line three
2 this is line three
3 this is line three

А это в выходном файле:

This is line number one.
This is line number two.
This is line number three.1 
2 
3 

Я не уверен, почему строковая переменная s не используется при записи в файл, хотя она определена ранее (другой блок, может быть, другие правила?).


person Vojtech    schedule 05.10.2011    source источник
comment
Общий комментарий: я думаю, что лучше иметь блок using(StreamReader){} и using(StreamWriter){}. А также вы должны назвать свою переменную 's' 'line', это понятнее, потому что это строка :)   -  person Baptiste Pernet    schedule 05.10.2011
comment
Я не знаю, проблема ли это в вопросе или в вашем коде, но ваши скобки не совпадают. Цикл while закрывается раньше, чем вы могли бы подумать, судя по отступу.   -  person Ray    schedule 05.10.2011
comment
Почему вы продолжаете циклически переходить от 1 к 4? Вы хотите повторить каждую строку четыре раза?   -  person Dan Abramov    schedule 05.10.2011
comment
@ Дэн Абрамов нет, я думаю, мне нужен цикл for для нумерации строк, но это мое впечатление от решения, и раньше я ошибался   -  person Vojtech    schedule 05.10.2011
comment
@Baptiste Pernet: комментарий к редактированию - я заметил в вашем редактировании, что вы фактически добавили фигурную скобку, которая меняет значение и выполнение программы. Будьте осторожны при исправлении форматирования, чтобы не исправить и другие вещи. :)   -  person Chris    schedule 05.10.2011
comment
У Джузеппе есть правильный способ сделать то, что вы хотите.   -  person Bastardo    schedule 05.10.2011
comment
Открывающая фигурная скобка для первого цикла for отсутствует: P, поэтому код не скомпилируется: D   -  person Zenwalker    schedule 05.10.2011
comment
+1 за попытку ответить на домашний вопрос и показать код. Так много домашних заданий в форме дайте мне код без каких-либо усилий   -  person RichK    schedule 05.10.2011
comment
@zenwalker: код на самом деле скомпилируется, потому что все фигурные скобки совпадают, просто не обязательно там, где вы ожидаете с первого взгляда. И это необходимо, чтобы объяснить, почему в файл не выводится строка и почему цикл for выполняется только один раз.   -  person Chris    schedule 05.10.2011


Ответы (8)


ОТКРЫТЫЙ ПОТОК

прочитать всю строку и сохранить ее во временной переменной. Используйте счетчик, чтобы отслеживать, какую строку вы прочитали. объединить счетчик с переменной temp. сохраните его в файл. переместите указатель строки на следующую строку и повторите.

ТОГДА ЗАКРЫВАЙТЕ СВОЙ ПОТОК

person Jawad Amjad    schedule 05.10.2011

Я мог бы предоставить вам правильный код, но, поскольку это домашняя работа, я просто задам вам вопрос, который должен привести вас к правильному ответу:

  • почему вы закрываете StreamReader внутри своего цикла? Вы все равно получите к нему доступ после, что может вызвать ошибку.
  • почему вы пишете в своем StreamWriter без предваряемого индекса?
  • Почему вы открываете StreamWriter внутри цикла? Не лучше ли открыть StreamWriter и StreamReader вне цикла. Вы работаете в цикле, а затем закрываете потоки?
person Baptiste Pernet    schedule 05.10.2011

Вам нужно добавить номер строки к каждой строке строки. Проверьте String.Format. Кроме того, попробуйте переменную счетчика, которая находится вне цикла while, чтобы сохранить количество строк.

Надеюсь, этого достаточно, чтобы направить вас на правильный путь, не давая вам точного ответа.

person Polynomial    schedule 05.10.2011

Вы уверены, что хотите закрыть поток внутри цикла while?

person Pete Houston    schedule 05.10.2011
comment
Я думаю, что поток закрывается после цикла while, потому что он стоит после скобки } - person Vojtech; 05.10.2011

Остерегайтесь циклов FOR, вы помещаете их внутрь While, так что в основном вы говорите:

while ((s = sr1.ReadLine()) != null)

Каждая строка читается

for (int i = 1; i < 4; i++)

Повторите 3 раза запись.

Кроме того, вы закрываете поток внутри while, поэтому после чтения первой строки.

person Dippi    schedule 05.10.2011

Вот один важный вопрос для вас:

        for (int i = 1; i < 4; i++)
            Console.WriteLine(i + " " + s);
        }

Вы закрываете цикл for фигурной скобкой, но не используете фигурную скобку, чтобы открыть его. Это означает, что приведенная выше фигурная скобка на самом деле закрывает цикл while, поэтому вы выполняете всю строку console.writeline, а затем, когда вы приходите к записи в файл, вы фактически вообще не читаете из файла - к обзору.

person Chris    schedule 05.10.2011
comment
закрывающая фигурная скобка принадлежит циклу while (неправильный отступ), цикл for не имеет обеих фигурных скобок. - person Giuseppe Romagnuolo; 05.10.2011
comment
@Giuseppe R: Я бы подумал, что более вероятно, что на самом деле скобки неверны, а не цикл while намеренно заканчивается там, но я рад исправиться. В любом случае, здесь определенно есть ошибка, поскольку цикл while не может сделать ничего полезного, поскольку очевидно, что действия, которые вы хотите записать в файл, должны выполняться для каждой прочитанной строки. - person Chris; 05.10.2011

person    schedule
comment
В домашних заданиях принято не давать полного решения задачи. Также ваша программа объединяет новый текст со старым, что явно нежелательно. - person Chris; 05.10.2011
comment
Мне удалось изменить его так, что теперь он создает новый файл, используя: StreamWriter sw1 = File.CreateText(Mytext2.txt); Итак, теперь он создает новый файл. Однако. Вывод во вновь созданном файле находится в одной строке. Я знаю, что мне нужно изменить код внутри класса stringbuilder, и я могу вставлять символы в строку: sb.Append(testing + lineOutput); и они появляются перед каждым строковым предложением, но когда я хочу вставить \n для новой строки, это не работает. - person Vojtech; 05.10.2011
comment
@ Крис, извини, не понял, что это домашнее задание. Удаление моего поста подойдет?! :) - person Giuseppe Romagnuolo; 05.10.2011
comment
ничего, разобрался -> System.Environment.NewLine :) спасибо за помощь! - person Vojtech; 05.10.2011
comment
@GiuseppeR: не стоит удалять IMO, так как это выглядит как правильный ответ. Я подумал с вашим представителем, что вы, возможно, не были рядом достаточно долго, чтобы забрать это, поэтому я пометил это. И ОП увидел это сейчас, так что уже слишком поздно беспокоиться. Надеюсь, он прочитает и поймет ваш код, а не просто скопирует и вставит его. :) - person Chris; 05.10.2011
comment
@ Крис, да, я прочитал код и теперь вижу, где я делал ошибку. Я изменил код еще больше, чтобы он больше соответствовал моим потребностям, как вы можете прочитать выше. Спасибо за помощь :) - person Vojtech; 05.10.2011
comment
@Vojtech: хороший материал. Для разрывов строк вы можете посмотреть методы AppendLine как в StreamWriter, так и в StringBuilder. Это избавляет вас от необходимости беспокоиться о новых строках самостоятельно. Вас также может заинтересовать File.WriteAllLines, в котором вы сохраняете свои строки в List‹string› или массиве или подобном, а затем просто используете этот статический метод, чтобы записать их все по заданному пути. Я бы предпочел последнее, так как я подозреваю, что это сделает код более красивым. :) - person Chris; 05.10.2011

person    schedule
comment
Я думаю, ты не понял, что это домашнее задание, ты действительно думаешь, что помогаешь ему? - person Baptiste Pernet; 05.10.2011
comment
@BaptistePernet Понимание моего кода — это уже домашняя работа. Он многому научится, пытаясь понять, как это работает. - person Muhammad Hasan Khan; 05.10.2011
comment
@ Хасан Абсолютно. Суть SO заключается в обучении с помощью качественных ответов, а не просто в том, чтобы позволить кому-то выполнить домашнее задание. Спасибо. - person Dan Abramov; 05.10.2011