使用fread从.txt文件中读取unsigned char会给出不同的值

时间:2015-05-28 05:55:39

标签: c file-io type-conversion fread unsigned-char

我剪切了以下代码,以便从.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 。告诉我这里出了什么问题,有人可以帮助我吗?感谢

4 个答案:

答案 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是从文件中读取格式化输入的一种方法。您可以使用原始代码段中显示的mallocwalking 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值为4932为空格,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++;
}