使用StreamReader逐个字符读取并输出文本文件

3

我想要做的是读取文件 a.txt,并将每个字符单独输出在一行中,但我很难解决这个问题,需要帮助。如果您编写代码,请添加注释以便我能更清楚地理解,因为我是初学者。谢谢!

namespace ConsoleApplication13
{
    class Program
    {
        static void Main(string[] args)
        {
            using (StreamReader r = new StreamReader("a.txt"))
            {

               string @char;
               while((@char = r.ReadBlock() != null))
                foreach(char i in @char)
                {
                    Console.WriteLine(i);

                }

            }

        }
    }
}

你的目的是逐个字符还是逐行处理?或者是其他方式?不太清楚你试图做什么。 - Marc Gravell
好的,说得不错 - 但是你能澄清一下你到底想做什么吗? - Marc Gravell
你可以使用BinaryReader代替StreamReader。它有ReadChar()方法。 - Vitalij B.
谢谢@monti,我会去看看的,参考资料也会很有帮助。 - Geek
1
您可以在此处阅读有关BinaryReader的信息:http://msdn.microsoft.com/zh-cn/library/system.io.binaryreader(v=vs.100).aspx。此外,还提供了代码示例。 - Vitalij B.
显示剩余2条评论
1个回答

10
我想读取文件并逐个字符输出,每个字符都以新行的形式出现。
好的,有很多方法可以做到这一点;对于小文件,最简单的方法是:
string body = File.ReadAllText("a.txt");
foreach (char c in body) Console.WriteLine(c);

使用ReadBlock逐块(而不是逐行)处理文件:

using (StreamReader r = new StreamReader("a.txt"))
{
    char[] buffer = new char[1024];
    int read;
    while ((read = r.ReadBlock(buffer, 0, buffer.Length)) > 0)
    {
        for (int i = 0; i < read; i++)
            Console.WriteLine(buffer[i]);
    }
}

这段代码每次读取长度不超过1024个字符的数据块,然后按照每个字符换行的方式输出所读取的内容。变量read告诉我们,在这一次迭代中读取了多少个字符;read > 0的测试(略微隐藏,但确实存在)询问“我们是否已经到达文件结尾?”——因为ReadBlock在结束时返回0。


谢谢,那真的很有帮助。所以读取块只能在写入之前读取1024个字符,还是可以读取更多? - Geek
@Geek,你可以将缓冲区大小设置为任何你想要的值;然而这是一个折衷方案,需要在内存中一次性加载所有内容(过大的缓冲区),和进行多次IO堆栈访问(过小的缓冲区)之间做出选择。通常的IO缓冲区大小在512字节到8k(8192字节)之间(仅供参考)。1024字节只是因为“对于大多数情况来说足够好,且分配成本相对较低”。请注意,我们在每个迭代中都使用相同的缓冲区 - 因此,您可以仅使用1k缓冲区处理200MB文件。 - Marc Gravell
谢谢Marc,那非常有价值和有帮助,再次感谢 :) - Geek

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接