逐字阅读文本文件

Mat*_*att 5 c#

我有一个文本文件,只包含小写字母,除空格外没有标点符号.我想知道通过char读取文件char的最佳方法,如果下一个char是空格,它表示一个单词的结尾和一个新单词的开头.即,当每个字符被读取时,它被添加到字符串中,如果下一个字符是空格,则该字被传递给另一个方法并重置,直到读者到达文件的末尾.

我正在尝试使用StringReader执行此操作,如下所示:

public String GetNextWord(StringReader reader)
{
    String word = "";
    char c;
    do
    {
        c = Convert.ToChar(reader.Read());
        word += c;
    } while (c != ' ');
    return word;
}
Run Code Online (Sandbox Code Playgroud)

并将GetNextWord方法放在while循环中直到文件结束.这种方法有意义还是有更好的方法来实现这一目标?

eou*_*3hf 17

有一种更好的方法可以做到这一点:string.Split()如果您读取整个字符串,C#可以自动将其拆分到每个空间:

string[] words = reader.ReadToEnd().Split(' ');
Run Code Online (Sandbox Code Playgroud)

words数组现在包含文件中的所有单词,您可以随意使用它们.

此外,您可能希望调查命名空间中的File.ReadAllText方法System.IO- 它可以使文件导入文本的生活更轻松.

编辑:我想这假设您的文件不是很大; 只要整个事物可以合理地读入内存,这将最容易.如果你有数千兆字节的数据要读,你可能会想回避这一点.我建议尽可能使用这种方法:它可以更好地利用您拥有的框架.

  • 这最终将用于非常大的文本文件,所以这仍然有效吗? (2认同)

Tim*_*ter 6

如果你对即使在非常大的文件上的良好性能感兴趣,你应该看看新的(4.0)MemoryMappedFile.

例如:

using (var mappedFile1 = MemoryMappedFile.CreateFromFile(filePath))
{
    using (Stream mmStream = mappedFile1.CreateViewStream())
    {
        using (StreamReader sr = new StreamReader(mmStream, ASCIIEncoding.ASCII))
        {
            while (!sr.EndOfStream)
            {
                var line = sr.ReadLine();
                var lineWords = line.Split(' ');
            }
        }  
    }
}
Run Code Online (Sandbox Code Playgroud)

来自MSDN:

内存映射文件将文件的内容映射到应用程序的逻辑地址空间.内存映射文件使程序员能够处理非常大的文件,因为可以同时管理内存,并且它们允许完全随机访问文件而无需搜索.内存映射文件也可以跨多个进程共享.

CreateFromFile方法从指定路径或磁盘上现有文件的FileStream创建内存映射文件.取消映射文件时,更改会自动传播到磁盘.

CreateNew方法创建一个未映射到磁盘上现有文件的内存映射文件; 适用于为进程间通信(IPC)创建共享内存.

内存映射文件与名称相关联.

您可以创建内存映射文件的多个视图,包括文件各部分的视图.您可以将文件的同一部分映射到多个地址以创建并发内存.要使两个视图保持并发,必须从同一个内存映射文件创建它们.使用两个视图创建同一文件的两个文件映射不提供并发性.