问题描述
我的代码正在读取包含整数的文件: 3 2 1 2 2 2 3
FILE *fptr;
fptr = fopen(argv[1],"r");
if (fptr == NULL)
{
printf("Cannot open file \n");
exit(0);
}
int c = fgetc(fptr);
printf("%c",c);
fclose(fptr);
这将按预期输出第一个数字3,但将其用作整数
printf("%d",c);
它改为输出51?我正在尝试将这些数字用作2D数组中计数器和位置的输入。
解决方法
您的文件不包含整数3 2 1 2 2 2 3
。
- 它包含比特流
- 可以将8位的组组合在一起。这些分组称为字节
- 这些字节由字符解释
编码(很可能是ASCII或UTF-8)来表示字符
3 2 1 2 2 2 3
。
字符编码是字节模式和与其关联的字符之间的映射。例如,UTF-8指出11111111 000000000 10011111 10011000 10000011
映射到字符Unicode字符1F603,“带有张开嘴的笑脸”:?。
您刚刚看到的是文件的第一个字节是00110011
,它是字符'3'
的ASCI编码。
根据encoding scheme,字符存储为整数。您的系统似乎使用了ASCII encoding set。每个单个字符都有各自的ASCII码整数值,该值确定该字符在内存中的存储方式。
'1'
具有ASCII值49
,'2'
具有ASCII值50
,而'3'
具有ASCII值51
。
以下是标准ASCII集的列表:
使用printf("%c",c);
时,c
被读取为字符。由于c
包含字符'3'
,因此它将打印字符值3
。
当您使用printf("%d",c);
时,c
被读为整数,而打印的不是3
,它是其相对ASCII码值,即51
我正在尝试将这些数字用作2D数组中计数器和位置的输入。
如果要将此字符值转换为整数,可以使用c - '0'
并将其分配给另一个变量:
int c = fgetc(fptr);
int i_c = c - '0';
printf("%d",i_c);
或再次返回c
:
int c = fgetc(fptr);
c = c - '0';
printf("%d",c);
两种情况下的输出:
3
,
您正在将3
读为字符。
在系统中,ASCII encoding之后,'3'
的十进制值为51
,因此当您打印读取的值时,它会打印51
如果您想要文字值,可以使用类似的
printf("%d",c- '0');
因为数字0
至9
必然在编码中具有严格增加的序列值。