C# 将行号添加到文本文件中

C# 将行号添加到文本文件中,c#,streamreader,streamwriter,C#,Streamreader,Streamwriter,我试图用C语言读取一个文本文件,并在其中添加行号 这是我的输入文件: 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() {

我试图用C语言读取一个文本文件,并在其中添加行号

这是我的输入文件:

    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();               
    }
}
这在输出文件中:

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

我不知道为什么在文件中写入时不使用字符串变量s,即使它是在前面定义的另一个块,可能是另一个规则?

您需要在每个行字符串前添加行号。签出String.Format。另外,尝试一个位于while循环外部的计数器变量来保持行号计数


希望这足以让您走上正确的道路,而不必给出确切的答案。

您确定要在循环中关闭流,而打开流吗

读取整行数据并将其存储在temp变量中。 用计数器记录你读过的那一行。 将计数器与temp变量连接起来。 将其保存到文件中。 将行指针移动到下一行,然后 重复一遍


然后关闭您的流

我可以为您提供正确的代码,但因为这是家庭作业,我只会问您一个问题,这将引导您找到正确的答案:

IEnumerable<string> lines = File.ReadLines(file)
                                .Select((line,i)=>i + " " + line)
                                .ToList();
File.WriteAllLines(file, lines);
为什么在循环中关闭StreamReader?之后您仍将访问它,这可能会导致错误。 为什么在StreamWriter中编写时没有预先指定的索引? 为什么要在循环中打开StreamWriter?在循环之外打开StreamWriter和StreamReader不是更好吗。您是否在循环中作业,然后关闭流?
注意循环,你把它们放在While中,所以基本上你是说:

while ((s = sr1.ReadLine()) != null)
每行都读

for (int i = 1; i < 4; i++)
一次写入重复3次


另外,您正在关闭while中的流,因此在第一行读取之后。

这里有一个主要问题:

using System;
using System.Collections.Generic;
using System.IO;
using System.Text;

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

            StreamReader sr1 = File.OpenText(path);


            string s = "";
            int counter = 1;
            StringBuilder sb = new StringBuilder();

            while ((s = sr1.ReadLine()) != null)
            {
                var lineOutput = counter++ + " " + s;
                Console.WriteLine(lineOutput);

                sb.Append(lineOutput);
            }


            sr1.Close();
            Console.WriteLine();
            StreamWriter sw1 = File.AppendText(path);
            sw1.Write(sb);

            sw1.Close();

        }

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

使用大括号关闭for循环,但不使用大括号打开它。这意味着上面引用的大括号实际上关闭了while循环,因此您可以循环执行所有console.writeline,然后当您开始写入文件时,实际上根本没有从文件中读取-s是由于作用域。

一般性评论:我认为使用streamreader{}和streamwriter{}更好块另外,您应该将变量命名为“line”,这更清楚,因为它是一行:我不知道这是问题还是代码的问题,但括号不匹配。while循环的关闭时间比您从缩进中想象的要早。为什么一直从1循环到4循环?你想每行重复四次吗?@Dan Abramov不,我想我需要一个for循环来对行进行编号,但这是我对解决方案的印象,在+1之前,我尝试家庭作业问题并显示代码是错误的。这么多的家庭作业问题都是以毫不费力地把代码给我的形式提出的。我想你没有意识到这是家庭作业,你认为你真的帮助了他吗?@BaptistePernet理解我的代码就足够了。哈桑说:“他会通过努力了解它的工作原理学到很多东西。”。SO的关键在于通过高质量的答案进行教育,而不仅仅是让某人完成作业。谢谢。我认为流在while循环之后关闭,因为它在}括号之后。在家庭作业问题中,通常不会给出问题的完整解决方案。另外,您的程序正在将新文本连接到旧文本,这显然是不需要的;现在它创建了一个新文件。然而新创建的文件中的输出在一行上。我知道我必须更改stringbuilder类中的代码,并且我能够在行中插入字符:sb.Appendtesting+lineOutput;它们出现在每一行句子的前面,但当我想为新行插入\n时,它不起作用。@Chris,抱歉,我没有意识到这是家庭作业。删除我的帖子就可以了没关系,我算出来了->System.Environment.NewLine:谢谢你的帮助@GiuseppeR:不值得删除IMO,因为它看起来是一个有效的答案。我和你的销售代表商量过,你可能没有足够长的时间来接这个电话,这就是为什么我把它挂了。而OP现在已经看到了,所以现在担心已经太迟了。希望他能够阅读并理解您的代码,而不是只是复制和粘贴代码结束的大括号属于while循环缩进错误,for循环没有两个大括号。@Giuseppe R:我认为更可能的是,实际上括号是错误的,而不是while循环故意在那里结束,但我很乐意接受更正。无论哪种方式,这里肯定有一个错误,因为while循环不能做任何有用的事情,因为很明显,您要将其写入文件的操作必须针对每一行读取执行。
        for (int i = 1; i < 4; i++)
            Console.WriteLine(i + " " + s);
        }