Индекс строки в StreamWriter

Я использую StreamWriter для записи в файл, но мне нужен индекс строки, в которую я пишу.

int i;
using (StreamWriter s = new StreamWriter("myfilename",true) {   
    i= s.Index(); //or something that works.
    s.WriteLine("text");    
}

Моя единственная идея - прочитать весь файл и посчитать строки. Есть лучшее решение?

@rene: дубликат, похоже, касается потоковых ридеров, а не стримрайтеров, и неясно, как здесь будут применяться ответы на этот вопрос ...

Chris 07.04.2018 22:23

@Chris хм, это правда, и я не могу найти другой дубликат. Повторное открытие и редактирование

rene 07.04.2018 22:29

Почему нельзя использовать i++; вместо i = s.Index();? Или вы тоже пишете \ r \ n в своем тексте?

rene 07.04.2018 22:32

@rene: обратите внимание, что писатель добавляет, поэтому, по-видимому, оператору необходимо знать, сколько строк уже существует, прежде чем они смогут выполнять свое собственное отслеживание.

Chris 07.04.2018 22:45

Тогда это своего рода тупик. Тогда им по-прежнему нужен StreamReader или, по крайней мере, они прочитают то, что уже есть в файле.

rene 07.04.2018 22:47

Итак, вы говорите мне, что чтение файла и подсчет в нем строк - единственный способ?

Tejföl 07.04.2018 22:53

@ Tejföl, если у вас нет этой информации, хранящейся где-либо еще, да. Один из вариантов может заключаться в том, что если все строки имеют одинаковую длину и ваш файл записан в кодировке, которая использует фиксированное количество байтов на символ, вы можете рассчитать, сколько строк там, разделив размер файла и длину строки.

rene 07.04.2018 23:04
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
7
402
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Определение линии

Определение 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;

Другие вопросы по теме