Я использую StreamWriter для записи в файл, но мне нужен индекс строки, в которую я пишу.
int i;
using (StreamWriter s = new StreamWriter("myfilename",true) {
i= s.Index(); //or something that works.
s.WriteLine("text");
}
Моя единственная идея - прочитать весь файл и посчитать строки. Есть лучшее решение?
@Chris хм, это правда, и я не могу найти другой дубликат. Повторное открытие и редактирование
Почему нельзя использовать i++; вместо i = s.Index();? Или вы тоже пишете \ r \ n в своем тексте?
@rene: обратите внимание, что писатель добавляет, поэтому, по-видимому, оператору необходимо знать, сколько строк уже существует, прежде чем они смогут выполнять свое собственное отслеживание.
Тогда это своего рода тупик. Тогда им по-прежнему нужен StreamReader или, по крайней мере, они прочитают то, что уже есть в файле.
Итак, вы говорите мне, что чтение файла и подсчет в нем строк - единственный способ?
@ Tejföl, если у вас нет этой информации, хранящейся где-либо еще, да. Один из вариантов может заключаться в том, что если все строки имеют одинаковую длину и ваш файл записан в кодировке, которая использует фиксированное количество байтов на символ, вы можете рассчитать, сколько строк там, разделив размер файла и длину строки.





Определение line index и, более конкретно, line в файле обозначается символом \n. Обычно (и в большей степени в Windows) этому может предшествовать символ возврата каретки \r, но это не обязательно и обычно отсутствует в Linux или Mac.
Итак, то, что вы запрашиваете, - это индекс строки в текущей позиции, в основном это означает, что вы запрашиваете количество \n, присутствующих перед текущей позицией в файле, в который вы пишете, что, похоже, является концом (добавлением к файлу), так что вы можете думать об этом как о том, сколько строк находится в файле.
Вы можете читать поток и подсчитывать их, учитывая объем оперативной памяти вашего компьютера, а не просто считывать весь файл в память. Так что это будет безопасно использовать для очень больших файлов.
// 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);
}
Если ваши файлы не такие большие (большие зависят от предполагаемой ОЗУ машины / устройства и программы в целом), и вы хотите просто прочитать весь файл в памяти (то есть в ОЗУ ваших программ), вы можете сделать один лайнер:
var numberOfLines = File.ReadAllLines(filePath).Length;
@rene: дубликат, похоже, касается потоковых ридеров, а не стримрайтеров, и неясно, как здесь будут применяться ответы на этот вопрос ...