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

时间:2011-10-05 10:14:37

标签: 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()
    {
        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,即使它是先前定义的(另一个块,另一个规则可能?)。

8 个答案:

答案 0 :(得分:2)

IEnumerable<string> lines = File.ReadLines(file)
                                .Select((line,i)=>i + " " + line)
                                .ToList();
File.WriteAllLines(file, lines);

答案 1 :(得分:2)

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();

        }

    }
}

答案 2 :(得分:1)

OPEN STREAM

读取整行并将其存储在临时变量中。 使用计数器跟踪您已阅读的行。 将计数器与temp变量连接起来。 将其保存到文件中。 将你的线指针移动到下一行和 重复。

然后关闭你的流

答案 3 :(得分:1)

我可以为您提供正确的代码,但由于这是家庭作业,我只会问您应该引导您找到正确答案的问题:

  • 为什么在循环中关闭StreamReader?之后您仍然可以访问它,这可能会导致错误。
  • 为什么在没有前置索引的情况下写入StreamWriter?
  • 为什么要在循环中打开StreamWriter?在循环外打开StreamWriter和StreamReader不是更好。你在循环中工作然后关闭Streams吗?

答案 4 :(得分:0)

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

希望这足以让你走上正确的道路,而不会给你准确的答案。

答案 5 :(得分:0)

您确定要在循环while内关闭流吗?

答案 6 :(得分:0)

注意FOR循环,你把它们放在While中,所以基本上你说的是:

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

读取每一行

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

写一次重复3次。

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

答案 7 :(得分:0)

以下是您的一个主要问题:

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

您正在使用花括号关闭for循环但不使用花括号来打开它。这意味着上面引用的大括号实际上正在关闭while循环,所以你循环完成所有的console.writeline,然后当你来写文件时,你实际上根本没有从文件中读取 - s是“”到期范围界定。