从c

时间:2015-04-30 09:11:31

标签: c file-io input fgets

我想阅读一个文本文件,其中图像像素值以这种方式存储

234
23
176
235
107
187
201
128
147
...
....
..

我试图以这种方式阅读此文本文件

#include<stdio.h>
#define M 2500
int main()
{

unsigned  new_img[M];
unsigned char a;
FILE *input;
input=fopen("D:/trail.txt","r");
for(i=0;i<M;i++)
{
    a=fgetc(input);
    new_img[i]=(int)a; 
    input++;
}
....

....

...
return 0;
}

当我尝试打印它时显示一些随机值。 此外,我的所有像素值都在0到255的范围内。但在输出屏幕上,我得到的值大到1到100万

2 个答案:

答案 0 :(得分:5)

根据fgetc()的{​​{3}},我们可以看到

  

fgetc()从流中读取下一个字符并将其作为unsigned char转换为int,或者在文件末尾或错误时返回EOF。

它以字典方式读取逐个字符,而不是基于

相反,我建议

  • 使用man page
  • 读取一行
  • 使用fgets()字符串输入转换为int
  • 将其存储到数组中。

其他一些建议:

  1. main()的推荐签名为int main(void)
  2. 在使用返回的指针之前,请务必检查fopen()是否成功。
  3. FWIW,fgetc()返回int。您应该在int变量中收集返回值,理想情况下。
  4. 注意:您需要处理由\n读取的尾随fgets()并错误检查输入的有效性。

答案 1 :(得分:0)

您正在使用fgetc(),这不是读取整数的正确方法,也是错误的。请注意,它的返回类型为int,因为它可以返回常量EOF。您将返回值截断为unsigned char,这没有任何意义。

它读取字符,因此输入字符串为例如234,您首先会看到字符2,然后是3,然后是4,然后是换行符,依此类推。不是你想要的。

你应该使用:

int pixel;

if(fscanf(input, "%d", &pixel) == 1)
{
  printf("read pixel %d\n", pixel);
}

这会转换十进制整数(可以包含许多单个字符),并将整数写入pixel。如果失败,则不会返回1