c - 用C读取文件的问题

标签 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);      
}

最佳答案

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

(arr[i])++;

arr[i]指向无效的内存位置,如 i 的值从for出来后没有被重置环形。因此,本质上您正在访问越界内存并面临off-by-one错误。这将导致 undefined behaviour .

注释:

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

关于c - 用C读取文件的问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28323590/

相关文章:

c - 为什么我们不能将结构对象作为结构内部的数据成员?

c - 使用 SSE 进行矩阵乘法错误 __m128 到 *float 转换?

c - github actions 输出到哪里去了?

c - C 中箭头运算符 (->) 的用法

c - 仅使用 C 安全地执行任意 Lua 代码

将全局 char** 复制到新的 char**

c - 倒回文件指针

c++ - 这些哪个更快?

c - 从包含数组的文件中存储/检索特定数组

c - 调用时绘制