Чтении происходит и после конца файла - C (СИ)
Формулировка задачи:
Появился след.вопросы:
Вопрос 1:
1.Если произвести запись в файл и после этого его закрыть и опять открыть, то при чтении файла конец легко обнаруживается.
2.Если произвести запись в файл и сделать сброс текущий позиции на нуль, то конец файла при чтении, также обнаруживается.
3.Если произвести запись в файл (см.код ниже), после этого сделать декремент текущий позиции и читать файл пока не встретится конец, то чтении происходит и после конца файла.
Так вот: правильно ли я понимаю (догадываюсь), что конец файла автоматически вставляется только после сброса текущий позиции функцией rewind() или закрытие файла?
Теперь вопрос два:
Если в отладчике visual studio в контрольных значениях просматривать на, что указывает текущая позиция, то даже если конец файла и есть, то он там никак не отмечается.
Например, если в файле записано "123", то тек.позиция при посимвольном чтении будет примерно такой: 123HHH... 23HHH.... 3HHH...... H.....
Но как тогда и где отмечается, что тут конец файла. Может быть где-то хранится его размер?
if((fp = fopen("file.txt","wb+")) == NULL){ fputs("error\n",stdout); exit(1); } else fputs("goog\n",stdout); do{ ch = getc(stdin); putc(ch,fp); }while(ch != '$'); fp->_ptr--; do{ ch = getc(fp); if(isspace(ch)){ puts("space"); } putc(ch,stdout); }while(!feof(fp));
Решение задачи: «Чтении происходит и после конца файла»
textual
Листинг программы
typedef struct { short level; /* fill/empty level of buffer */ unsigned flags; /* File status flags */ char fd; /* File descriptor */ unsigned char hold; /* Ungetc char if no buffer */ short bsize; /* Buffer size */ unsigned char *buffer; /* Data transfer buffer */ unsigned char *curp; /* Current active pointer */ unsigned istemp; /* Temporary file indicator */ short token; /* Used for validity checking */ } FILE;
Объяснение кода листинга программы
- Типизация структуры данных файла.
- Определение полей структуры: — level — уровень заполнения/пустоты буфера; — flags — флаги состояния файла; — fd — дескриптор файла; — hold — прокси-символ для «ungetc», если буфер отсутствует; — bsize — размер буфера; — buffer — указатель на буфер передачи данных; — curp — указатель на текущий активный указатель; — istemp — признак временного файла; — token — используется для проверки корректности.
- Предполагается, что код написан на C.
- Задача программы — чтение, происходящее даже после достижения конца файла.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д