我剪切了以下代码,以便从.txt文件中读取16个unsigned char值。
#include<stdio.h>
#include<stdlib.h>
int main()
{
int i, j, k, load_size;
unsigned char *buf;
load_size = 16;
buf = (unsigned char *)malloc(load_size);
FILE *fin;
fin = fopen("demo_input1.txt", "r");
fread(buf, 1, load_size, fin);
for(i=0;i<16;i++){
printf("%d ", *buf);
buf++;
}
system("PAUSE");
}
文件&#39; demo_input1.txt&#39;包含值 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 。但我在控制台值中输出 49 32 50 32 51 32 52 32 53 32 54 32 55 32 56 32 。告诉我这里出了什么问题,有人可以帮助我吗?感谢
答案 0 :(得分:3)
fread
用于读取原始输入。由于您的文件是格式化文本,请使用以下内容:
int nums[SIZE];
int count = 0;
while( fscanf(fin, "%d", nums + count) == 1 ) {
if(++count == SIZE) break; /* More than expected numbers in file */
}
稍后您可以使用以下方式打印:
for(i = 0; i < count; i++) {
printf("%d ", nums[i]);
}
fscanf
是从文件中读取格式化输入的一种方法。您可以使用原始代码段中显示的malloc
,walking pointers
或根据您的要求。
答案 1 :(得分:0)
另一种方法是使用fgets()
将整行读取到缓冲区,使用空格作为分隔符,然后将字符串转换为整数并存储或打印它们。
char buf[300];
int a[30],i=0;
while(fgets(buf,sizeof(buf),fin))
{
char *p = strtok(buf," ");
i = 0;
while( p != NULL)
{
a[i] = atoi(p);
printf("%d ",a[i]);
i++;
p = strtok(NULL," ");
}
}
PS:当使用fgets()
时,你需要有预定义的大数组来保存输入,否则可能会导致错误的结果。
答案 2 :(得分:0)
正在发生的事情是完全正确的,但不是你所期望的。发生什么了?您从文件中读取1个字节到char
,然后使用%d
输出它,它将以十进制形式输出。查看ascii表,如果您阅读char
1
,其ASCII值为49
,32
为空格,50
为{{1 }}, 等等。您不能只读这样的普通数字,代码,用2
替换%d
只能用于二进制文件,而不能用于人类可读的文件。
您要使用的是%c
而不是fread
,它的作用类似于fscanf
,但是从文件中读取。在那里你可以指定读取一个整数,从而得到没有空格的整数。您可以检查它们是否小于scanf
,如果是,则转换为char。
答案 3 :(得分:0)
它将空间的ascii值视为32(空间的ASCII)。
只需在for循环中进行一个简单的更改即可。 而不是%d使用%c
for(i=0;i<16;i++)
{
printf("%c ", *buf);
buf++;
}