2013-08-30 3 views
3

На this Википедией страницы есть чтение образца C программы и печать первых 5 байт из файла:ЕОКП возвращаемого значения сохраняется в переменном полукоксе

#include <stdio.h> 
#include <stdlib.h> 

int main(void) 
{ 
    char buffer[5] = {0}; /* initialized to zeroes */ 
    int i; 
    FILE *fp = fopen("myfile", "rb"); 

    if (fp == NULL) { 
     perror("Failed to open file \"myfile\""); 
     return EXIT_FAILURE; 
    } 


    for (i = 0; i < 5; i++) { 
     int rc = getc(fp); 
     if (rc == EOF) { 
      fputs("An error occurred while reading the file.\n", stderr); 
      return EXIT_FAILURE; 
     } 
     buffer[i] = rc; 
    } 

    fclose(fp); 

    printf("The bytes read were... %x %x %x %x %x\n", buffer[0], buffer[1], buffer[2], buffer[3], buffer[4]); 

    return EXIT_SUCCESS; 
} 

Части я не понимаю, что он использует getc функция, которая возвращает int и сохраняет ее в массиве char s - как можно хранить int s в массиве char?

ответ

2

Технически, C позволяет вам «сократить» переменную, присвоив ее чем-то, что меньше, чем оно. Спецификация не говорит ТОЧНО, что происходит, когда вы это делаете (из-за технических особенностей на некоторых машинах, где происходят немного странные вещи), но на практике почти на всех машинах, которые вы, вероятно, будете использовать, если не работаете на музейных экспонатах или не очень специальное оборудование, оно просто действует так, как будто «верхние» биты большего числа были «обрезаны».

И в данном конкретном случае, getc специально разработан, чтобы вернуть то, что соответствует в char, за исключением случая, когда он возвращается EOF, который часто имеет значение -1. Хотя довольно часто char может также поддерживать значение -1, но это не гарантируется (если char является неподписанным типом - то, что стандарты C и C++ поддерживают одинаково с char, являющимся подписанным типом, который может быть -1).

1

Проверить this из: -

Если целое значение, возвращаемое GETC() хранится в переменной символьного типа и затем сравнивается с целочисленной константой EOF, то сравнение никогда не может добиться успеха, потому что sign-extension переменной тип char при расширении до целого определяется реализацией.

0

Да, getc() возвращает целое число. Однако, за исключением специального возвращаемого значения EOF, возвращаемое значение всегда будет находиться в пределах диапазона char (от -128 до 127 на машине комплимента 2 с стандартными символами по умолчанию).

Поэтому после проверки EOF всегда безопасно передавать значение переменной char без потери данных.

 Смежные вопросы

  • Нет связанных вопросов^_^