在C中读取文件的问题

时间:2015-02-04 14:16:18

标签: c

我编写了一个程序来扫描文件中的数字,并查找每个数字的出现次数。它有效,但最多只有33行。如果我的文本文件有34行及以上,则不响应。我可以知道问题是什么,需要做些什么? 这是代码:`

#include<stdio.h>
#include<conio.h>
int numOfDig(int);
int numOfLines(FILE*);
main()
{
  FILE *fp;  
  char ch;
  int c,i,flag=1,line=1,numLine;
  int arr[101];
  for(i=1;i<101;i++)
  {
    arr[i]=0;
  }  
  fp = fopen("new1.txt","r");
  numLine=numOfLines(fp);     
  fclose(fp);
  fp=fopen("new1.txt","r");
  while(line<=numLine)
  {
   ch=fgetc(fp);
    while((ch=fgetc(fp)!=10))
  {           
    fscanf(fp,"%d",&i);      
    (arr[i])++;    
    c=numOfDig(i);    
      fseek(fp,c-2,SEEK_CUR);        
  }
  line++;  
  }  
  fclose(fp);  
  for(i=1;i<101;i++)
  {
    if(arr[i]!=0)
      printf("%d = %d\n",i,arr[i]);  
  }  
  getch();
}

int numOfDig(int num)
{
  int n=0;
  for(n=0;num>0;num/=10)
    n++;   
  return(n);
}

int numOfLines(FILE *fp)
{
  int numLines=0;
  char ch;
  do 
  {``
    ch = fgetc(fp);
    if(ch == '\n')
      numLines++;
  } while (ch != EOF);
  printf("%d ",numLines);
  return (numLines);      
}

3 个答案:

答案 0 :(得分:1)

除了[已在其他答案和评论中指出]的其他逻辑问题,我可以在您的代码中看到

(arr[i])++;

arr[i]指向无效的内存位置,因为i循环后for的值未被重置。所以,基本上你是在访问越界内存并面对 off-by-one 错误。这将导致undefined behaviour

注意:

  • for(i=1;i<101;i++)中,循环应该从0开始,因为C数组的起始索引为0
  • 在访问返回的指针之前,始终检查fopen()是否成功。

答案 1 :(得分:1)

除了指出的EOF问题外,我还将逐行检查代码的4行部分。在第一行fscanf()i设置为从文件中读取的数字作为文本。

fscanf(fp,"%d",&i);

在下一行中,您尚未测试i的值,如果i < 0i > 100,则会破坏数组。

(arr[i])++;

下一行确定数字中有多少位数。

c=numOfDig(i);

假设文件包含序列&#34; a0&#34;。然后重新定位文件指针,但如果数字c == 0,您将获得无限循环,因为文件指针将重绕2并重新读取相同的序列。

fseek(fp,c-2,SEEK_CUR);

这是因为您的函数numOfDig()不正确。传递0后,它会返回0而不是1

答案 2 :(得分:0)

问题在于逻辑。你只计算'\n'符号,但文件中的最后一行最后没有这个符号。将条件更改为if(ch == '\n' || ch == EOF) numLines++;