получить позицию курсора файла в C - PullRequest
3 голосов
/ 25 декабря 2009

Я читаю файл с помощью fgetc, поэтому каждый раз, когда он читает символ, положение курсора изменяется.

Можно ли узнать после каждого чтения "координаты" курсора в файле в терминах столбца и номера строки?

Спасибо

Ответы [ 2 ]

7 голосов
/ 25 декабря 2009

Вы можете использовать ftell

Он не дает вам позицию в терминах строки и столбца, но дает текущую позицию в потоке с самого начала.

5 голосов
/ 25 декабря 2009

В файле нет «координат», только позиция. Текстовый файл - это просто поток байтов, а строки разделяются переносами строк. Таким образом, при чтении текстового файла вы можете рассчитать свои «координаты», если вы сканируете весь файл. Это означает, что если вам действительно нужно какое-то значение "row" и "column":

  • Читать файл построчно. Подсчитайте символы новой строки, и вы получите номер строки. Имейте в виду, что в разных ОС используются разные символы разрыва строки - окончания строк в Unix отличаются от Windows.
  • Считайте соответствующую строку символ за символом и посчитайте символы до позиции, о которой идет речь. Это даст вам номер "столбца". Очевидно, что вы должны принять, что количество «столбцов» может варьироваться между «строками», и вполне возможно иметь «строки» с «количеством столбцов», равным 0.

Другой подход был бы к

  • Читайте файл построчно и строите массив позиций (используя ftell) разрывов строк.
  • Теперь, чтобы определить положение любого символа, просто найдите его положение в файле, а затем найдите ближайший предыдущий разрыв строки. От счетчика разрыва строки до символа вы получаете «строку», из разницы между позицией разрыва строки и текущей позицией вы получаете «столбец».

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

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