StreamWriter中的行索引

时间:2018-04-07 20:13:14

标签: c# file streamwriter

我使用StreamWriter写入文件,但我需要写入第I行的索引。

tf.eval()

我唯一的想法是阅读整个文件并计算行数。有更好的解决方案吗?

1 个答案:

答案 0 :(得分:1)

一行

的定义

文件中line index,更具体地说line的定义由\n字符表示。通常情况下(在Windows上也是如此),这可以在回车符\r前面加上,但不是必需的,通常不会出现在Linux或Mac上。

正确的解决方案

所以你要问的是当前位置的行索引基本上意味着你要求在你写入的文件中当前位置之前存在\n的数量,这似乎是结束(附加到文件),因此您可以将其视为文件中有多少行。

您可以读取流并计算这些流,并考虑您的机器RAM,而不仅仅是将整个文件读入内存。因此,在非常大的文件上使用它是安全的。

// File to read/write
var filePath = @"C:\Users\luke\Desktop\test.txt";

// Write a file with 3 lines
File.WriteAllLines(filePath, 
    new[] {
        "line 1",
        "line 2",
        "line 3",
    });

// Get newline character
byte newLine = (byte)'\n';

// Create read buffer
var buffer = new char[1024];

// Keep track of amount of data read
var read = 0;

// Keep track of the number of lines
var numberOfLines = 0;

// Read the file
using (var streamReader = new StreamReader(filePath))
{
    do
    {
        // Read the next chunk
        read = streamReader.ReadBlock(buffer, 0, buffer.Length);

        // If no data read...
        if (read == 0)
            // We are done
            break;

        // We read some data, so go through each character... 
        for (var i = 0; i < read; i++)
            // If the character is \n
            if (buffer[i] == newLine)
                // We found a line
                numberOfLines++;
    }
    while (read > 0);
}

懒惰的解决方案

如果你的文件不是那么大(大部分依赖于你想要的机器/设备RAM和整个程序),你想要将整个文件读入内存(所以你的程序RAM中),你可以做一个衬垫:

var numberOfLines = File.ReadAllLines(filePath).Length;