我使用StreamWriter写入文件,但我需要写入第I行的索引。
tf.eval()
我唯一的想法是阅读整个文件并计算行数。有更好的解决方案吗?
答案 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;