Чтении происходит и после конца файла - 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.
- Задача программы — чтение, происходящее даже после достижения конца файла.