C-从文件中读取并在打印内容时获得意外结果

时间:2014-04-02 17:47:19

标签: c

我有一个从命令行读取文件的程序(由整数组成的文件 - 见下文),将其放入数组然后打印数组。

#include <stdio.h>
#include <stdlib.h>

#define SIZEBUFF 1024


int main (int argc, char *argv[])
{

 if (argc < 2)
   {
     printf("Missing file\n");
     return (EXIT_FAILURE);
   }

    FILE *file = fopen (argv[1],"r");
    int integers [144]; //Array that input is stored

    char buffer[SIZEBUFF];
    int count = 0;
    while (fgets(buffer,sizeof (buffer),file) > 0){ // !=EOF gives seg. fault if used
    integers[count] = atoi(buffer);
    count++;

    }

fclose(file);

printf ("The contents of integer array are: \n");

int j;
for (j = 0; j < 144;j++) printf ("%d\t",integers[j]);

return (EXIT_SUCCESS);


}

enter image description here

注意:真实文件由144个整数组成。我刚拿了第12个

如何只打印文件中存在的数字?

3 个答案:

答案 0 :(得分:2)

这个问题是因为您编写的代码假定fgets()在每次调用时从文件中读取单个整数。但如果整数存储在同一条线上则不是这样。

fgets() stops when either (n-1) characters are read, the newline character is read, or the end-of-file is reached, whichever comes first.

所以这里fgets一次从文件中读取多个整数,因此atoi()也没有得到文件中的整数。
您可以使用fscanf()直接读取整数,

fscanf(file,"%d",&integers[count]);

你可以循环遍历这个语句144次,因为你知道文件中的整数或者可以使用,

  fscanf (file, "%d", &integers[count]);    
  while (!feof (file))
    {  
      fscanf (file, "%d", &integers[++count]);      
    }

答案 1 :(得分:0)

您可以使用fscanf,就像使用scanf从控制台读取144个整数一样。

答案 2 :(得分:0)

您应该使用fscanf将文件中的整数读入数组。

int count = 0;
while(fscanf(file, "%d", &integers[count++]) == 1)
    ; // the null statement

int j;
for(j = 0; j < count; j++)
    printf("%d\t", integers[j]);