在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
数组中?
答案 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变量并且没有数据丢失总是安全的。