Чтение строки X до строки Y из файла в C ++ - PullRequest
0 голосов
/ 12 мая 2009

У меня относительно простой вопрос. Скажем, у меня есть файл, но я хочу получить доступ только к строке X файла до строки Y, какой самый простой способ сделать это?

Я знаю, что могу читать в строках по очереди, пока не достигну нужных мне строк, но есть ли лучшее, более элегантное решение?

Спасибо.

Ответы [ 5 ]

5 голосов
/ 12 мая 2009

В C ++ нет, не совсем (ну, не на любом языке, с которым я знаком, правда).

Вы должны начать с начала файла, чтобы определить, где начинается строка X (если это не файл с фиксированной длиной записи, но вряд ли для текста).

Точно так же вы должны делать это, пока не найдете последнюю интересующую вас строку.

Вы можете читать символы вместо строк, если вы боитесь эксплойтов переполнения буфера, или вы можете читать в блоке фиксированного размера и считать строки для скорости, но все сводится к чтению и проверке каждого символа (по вашему коду явно или языковые библиотеки неявно) для подсчета новых строк.

4 голосов
/ 12 мая 2009

Вы можете использовать istream :: ignore (), чтобы избежать буферизации ненужного ввода.

bool skip_lines(std::istream &is, std::streamsize n)
{
  while(is.good() && n--) {
     is.ignore(std::numeric_limits<std::streamsize>::max(), '\n');
  }

  return is.good();
}
2 голосов
/ 12 мая 2009

Так как вы должны обеспечить символы конца строки внутри каждой строки, чтобы иметь возможность считать строку, вам все равно нужно перебрать файл. Единственная оптимизация, о которой я могу подумать, это не читать файл построчно, а буферизовать его, а затем повторять подсчет строк.

2 голосов
/ 12 мая 2009

Ищите \ n X раз, начинайте «читать» (независимо от обработки), пока не достигнете Y-X \ n или EOF. Предполагая, что новые строки в стиле Unix.

0 голосов
/ 13 мая 2009

Используя C или C ++, существуют некоторые функции, которые можно использовать для пропуска определенного количества байтов в файле (fseek в stdio и seekp с istreams и ostreams). Однако вы не можете указать заданное количество строк, поскольку каждая строка может иметь переменное количество символов, и, следовательно, невозможно рассчитать правильное смещение. Файл - это не какой-то массив, где каждая строка занимает «строку»: вы скорее должны видеть его как непрерывное пространство памяти (здесь не думают об аппаратных средствах…)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...