Чтении происходит и после конца файла - 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;

Объяснение кода листинга программы

  1. Типизация структуры данных файла.
  2. Определение полей структуры: — level — уровень заполнения/пустоты буфера; — flags — флаги состояния файла; — fd — дескриптор файла; — hold — прокси-символ для «ungetc», если буфер отсутствует; — bsize — размер буфера; — buffer — указатель на буфер передачи данных; — curp — указатель на текущий активный указатель; — istemp — признак временного файла; — token — используется для проверки корректности.
  3. Предполагается, что код написан на C.
  4. Задача программы — чтение, происходящее даже после достижения конца файла.

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

10   голосов , оценка 4.4 из 5
Похожие ответы