получите позицию курсора файла в C

Я читаю файл с fgetc, таким образом, каждый раз он читает символ, курсор positio изменяется.

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

Спасибо

5
задан asdf 30 December 2011 в 22:55
поделиться

2 ответа

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

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

8
ответ дан 18 December 2019 в 14:47
поделиться

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

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

Другой подход -

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

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

.
5
ответ дан 18 December 2019 в 14:47
поделиться
Другие вопросы по тегам:

Похожие вопросы: