getc返回值存储在char变量中

时间:2013-08-30 19:27:53

标签: c getc

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的数组中 - 如何存储{{} 1}}在一个int数组中?

3 个答案:

答案 0 :(得分:2)

从技术上讲,C允许您通过将变量分配给比自身小的变量来“缩短”变量。规范并没有明确说明当你这样做时会发生什么(因为某些机器的技术性稍微有些奇怪的事情发生),但在实践中,几乎所有你可能会使用的机器,除非你在博物馆工作或非常特殊的硬件,就好像大数字的“高位”被“切断”一样。

在这种特殊情况下,getc专门用于返回适合char的内容,但返回EOF的情况除外,-1的值通常为char 1}}。尽管-1经常支持值char,但不能保证这种情况(如果char是无符号类型) - C和C ++标准同样支持-1是签名类型,可以是{{1}})。

答案 1 :(得分:1)

检查this: -

  

如果getc()返回的整数值存储在变量中   键入char然后与整数常量EOF进行比较   比较可能永远不会成功,因为变量的符号扩展   扩展为整数的类型char是实现定义的。

答案 2 :(得分:0)

是的,getc()返回一个整数。但是,除了特殊的返回值EOF之外,返回的值将始终在char的范围内(在具有默认签名字符的2的恭维机器上为-128到127)。

因此,在检查EOF之后,将值传递给char变量并且没有数据丢失总是安全的。