3

Wikipedia 页面上,有一个示例 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返回 anint并将其存储在 s 数组中的函数char- 怎么可能将ints 存储在char数组中?

4

3 回答 3

3

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

在这种特殊情况下,getc专门设计用于返回适合 a 的内容char,但返回的情况除外EOF,它通常具有 value -1。虽然很多时候,char也可能支持具有该值-1,但不能保证是这种情况(如果char是无符号类型 - C 和 C++ 标准同样支持char作为有符号类型的东西-1)。

于 2013-08-30T19:36:12.087 回答
1

看看这个: -

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

于 2013-08-30T19:30:14.720 回答
0

是的,getc() 返回一个整数。然而,除了特殊的返回值 EOF,返回值总是在一个字符的范围内(在默认有符号字符的 2 的补码机器上为 -128 到 127)。

因此,在检查 EOF 之后,将值传输到 char 变量始终是安全的,而不会丢失数据。

于 2013-08-30T19:33:48.853 回答