从c中的文本文件中读取整数

reading integers from text file in c

我想读取以这种方式存储图像像素值的文本文件

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 万

根据fgetc()man page,我们可以看到

fgetc() reads the next character from stream and returns it as an unsigned char cast to an int, or EOF on end of file or error.

它以字典顺序逐个字符读取,而不是基于

相反,我建议

  • 使用 fgets()
  • 读取一行
  • 使用strtol()
  • 字符串输入转换为int
  • 存入数组

其他一些建议:

  1. main()的推荐签名是int main(void)
  2. 在使用 returned 指针之前始终检查 fopen() 是否成功。
  3. FWIW,fgetc() return 和 int。理想情况下,您应该在 int 变量中收集 return 值。

注意:您需要注意 fgets() 读取的尾随 \n 并检查输入有效性的错误。

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

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

你应该只使用:

int pixel;

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

这将转换一个十进制整数(可以由许多单独的字符组成),并将该整数写入pixel。如果失败,则不会 return 1.