在这维基百科页面上,有一个示例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的数组中--如何将ints存储在char数组中?
发布于 2013-08-30 19:36:12
在技术上,C允许通过将变量分配给比自身小的变量来“缩短”变量。该规范没有具体说明当您这样做时会发生什么(因为在某些机器中会发生一些稍微奇怪的事情),但实际上,在几乎所有您可能使用的机器上,除非您使用博物馆的藏品或一些非常特殊的硬件,否则它的作用很简单,就好像大数字的“上层”部分已经被“切断”了一样。
在这种特殊情况下,getc被专门设计为返回适合于char的内容,但当它返回EOF时除外,后者通常具有-1值。尽管很多时候,char也很可能支持具有-1值,但情况并不一定是这样的(如果char是一个无符号类型--C和C++标准同样支持这一点,而char是一个可以是-1的有符号类型)。
发布于 2013-08-30 19:30:14
查看这:-
如果getc()返回的整数值存储在char类型的变量中,然后与整数常量EOF进行比较,则比较可能永远不会成功,因为char类型变量在扩展为整数时的符号扩展是实现定义的。
发布于 2013-08-30 19:33:48
是的,getc()返回一个整数。但是,除了特殊的返回值EOF之外,返回的值将始终在一个字符的范围内(在带有默认签名字符的2的称赞机器上-128到127之间)。
因此,在检查EOF之后,始终可以安全地将值传递到char变量,而不会丢失数据。
https://stackoverflow.com/questions/18540179
复制相似问题