![]() |
|
Модераторы: bsa |
![]()
|
|
| GQU |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 272 Регистрация: 13.2.2011 Репутация: нет Всего: нет |
Почему функция в программе начинает работу со считывания символа '\n', а не EOF?
В 666.txt содержится: 1 2 3 4 (знака ENTER после 4 нет, пробелов вообще нет)
Это сообщение отредактировал(а) GQU - 1.9.2015, 11:21 |
|||
|
||||
| math64 |
|
|||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2505 Регистрация: 12.4.2007 Репутация: 12 Всего: 72 |
1. f_pos не инициализируется. В большинстве компиряторов оно будет 0, но не всегда.
2. Если ОС Windows, то разделитель строк - '\r' '\n' (0x0D 0x0A), но при открытии fopen в решиме "r" '\r' будут пропускаться. Поэтому f_pos будет меньше размера файла. Чтобы '\r' не пропускались, нужно открывать в режиме "rb". |
|||
|
||||
| GQU |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 272 Регистрация: 13.2.2011 Репутация: нет Всего: нет |
Все равно не до конца понял,
Файл в режиме "r" открывается так: 1, \n ,2, \n, 3 ,\n, 4, EOF После того, как отработала функция, мы в позиции 7(сохраняется в глобальную f_pos), начиная с 0, мы с символа EOF должны начать читать символы, когда следующий раз зайдем в функцию test(), а не с \n, почему читается другой символ? Это сообщение отредактировал(а) GQU - 1.9.2015, 14:32 |
|||
|
||||
| volatile |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2107 Регистрация: 7.1.2011 Репутация: 16 Всего: 85 |
||||
|
||||
| GQU |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 272 Регистрация: 13.2.2011 Репутация: нет Всего: нет |
Напишу может кому пригодится(сам потом читаю
Реальное положене дел в файле 1,0D,0A,2,0D,0A,3,0D,0A,4,EOF Как видит программа и мы в отладчике 1,\n,2,\n,3,\n,4,EOF Я считал, что на позиции 8 EOF, а на самом деле там был 0D Это сообщение отредактировал(а) GQU - 1.9.2015, 16:06 |
|||
|
||||
| math64 |
|
|||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2505 Регистрация: 12.4.2007 Репутация: 12 Всего: 72 |
Реально в файле EOF нет - это такой же искусственный символ, как и выкидывaние 0D ('\r') при чтении в режиме "r".
Как было уже сказано, позицию нужно получать через ftell(), а не считать самому. Если нужно получать '\r', нужно открывать в режиме "rb" (бинарный для чтения). В текстовом режиме ("r") также чтение файла остановится, и получим EOF, если встретится 1C (Ctrl-Z) Это сообщение отредактировал(а) math64 - 2.9.2015, 07:53 |
|||
|
||||
| GQU |
|
||||||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 272 Регистрация: 13.2.2011 Репутация: нет Всего: нет |
А выкидывание \r на каком этапе происходит, это дело рук fgetc? если бы это делал fopen, то когда 2-ой раз заходили в функцию, все позиции f_pos бы совпадали
Не обязательно использовать ftell, я и без него обошелся, нужно просто добавить условие, что если ichar==10, то смещаемся на 2 позиции Вот, можете проверить, программа по порциям выводит символы из текстового файла и показывает, сколько процентов осталось, в консоле нужно набрать имя файла, например 666.txt
Это сообщение отредактировал(а) GQU - 2.9.2015, 08:39 |
||||||
|
|||||||
| feodorv |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 2214 Регистрация: 30.7.2011 Репутация: 12 Всего: 45 |
Это не верно. Если, не дай Бог, в файле встретится просто '\n' без '\r', то смещая на 2, Вы совершите ошибку. Непонятное упрямство. Если Вам важны смещения, то открывайте файл в бинарной моде "rb", тогда он будет считываться таким, каков он есть. И все смещения будут правильными. Это сообщение отредактировал(а) feodorv - 2.9.2015, 10:00 -------------------- Напильник, велосипед, грабли и костыли - основные инструменты программиста... |
|||
|
||||
| math64 |
|
|||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2505 Регистрация: 12.4.2007 Репутация: 12 Всего: 72 |
При открытии файла с помощью fopen() запоминается режим работы (бинарный или текстовый) и выделяется пустой буфер. При чтении fgetc() или другой функцией, если буфер пуст, считывется порция файла в буфер. '\r' могут выкидиваться сразу после заполнения буфера или при каждом чтении - в зависимости от реализации. Как конкретно в вашем случае - можно посмотреть отладчиком в переменной fp после первого fgetc(). |
|||
|
||||
![]()
|
| Правила форума "C/C++: Для новичков" | |
|
|
Запрещается! 1. Публиковать ссылки на вскрытые компоненты 2. Обсуждать взлом компонентов и делиться вскрытыми компонентами
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, bsa. |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | C/C++: Для новичков | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |