如何从文件中读取数字以获取C中的大小

时间:2018-12-03 07:07:20

标签: c file fgets

对于作业,我必须创建2个文件,每个文件的数字都超过100位。我可以很好地做到这一点,但是当需要确切找出文件中有多少位数时,我尝试了fgets(),但我认为我处理得不好。任何帮助将不胜感激。

#include <stdio.h>
#include <stdlib.h>
#include<time.h> 
#include <stdio.h>
int getc(FILE *stream);
int getchar(void);

这并不是解决我的问题的必要方法,但这是我代码的一部分,最终我需要获取每个数字的大小并将其作为参数传递给这里:

int * add(int * a,int s_a,int * b,int s_b){
  if(s_b<s_a){
    int tmp_s;
    int * tmp_a;

    tmp_s=s_a;
    s_a=s_b;
    s_b=tmp_s;

    tmp_a=a;
    a=b;
    b=tmp_a;
  }
  int * out= (int *)malloc (sizeof(int)*(s_b+1));
  int i, carry,sum;
  carry=0;
  for(i=0;i<s_a;i++){
    sum=((a[i])+b[i]%10)+carry;
    carry=(a[i]+b[i])/10;
    out[i]=sum;
  }
  for(i;i<s_b;i++){
    sum=(b[i]+carry)%10;
    carry=(b[i]+carry)/10;
    out[i]=sum;
  }
  out[i]=carry;
  return out;

}

这是我在文件中添加随机数的地方,我不添加空格,因为它应该都是一个非常长的数字。尽管我拥有此函数的大小,但这并不是该函数的用途,并且下一个函数正常工作后,print语句将被注释掉。

void addrandomNums(char * fileName){
  srand ( time(NULL) );
  FILE *ffp;
  ffp=fopen(fileName,"w");//if the file exsisists then we erase and write    
 new stuff
  int sizeOfNum=rand()%10000+100;//the size of the number will be from 100-10099(I think)the instructions said a number greater than 100 digits so I tried to make this as wide of a range as possible
  printf("Size of the number for this file is: %d  digits \n",sizeOfNum);
  for(int i=1;i<sizeOfNum;i++){
    fprintf(ffp,"%d", rand() % 10);//adds a number from 0-9
  }
  fclose(ffp);
}

这是需要帮助的功能,我不知道自己在做什么错。

int getNumDigits(char * fileName){
    int numDigits=0;
    FILE *fp=fopen(fileName,"w");
    printf( "Reading the file: %s \n" ,fileName) ;
    if (fp == NULL) 
        printf("The file is not found!!");
    return 0;  
    do
    { 
        // Taking input single character at a time 
        char c = fgetc(fp); 

        // Checking for end of file 
        if (feof(fp)) 
            break ; 

        printf("%c", c); 
        numDigits++;
    }  while(1); 
    fclose(fp);
    printf("***The number of characters present in file is: %d \n",numDigits);
    //getch();
    return numDigits;
}
int main(void) {
    addrandomNums("num1.txt");

    addrandomNums("num2.txt");
    int size1=getNumDigits("num2.txt");

    return 0;
}

谢谢大家的帮助,这是固定代码。我非常感谢您的帮助。

 int getNumDigits(char * fileName){
     int numDigits=0;
     FILE *fp=fopen(fileName,"r");

     printf( "Reading the file: %s \n" ,fileName) ;
   //char buffer[MAX]=fgets()
   // int length=strlen(fgets(buffer, MAX, fp));
   if (fp == NULL) 
   printf("The file is not found!!");
   char c;      
   do{ 
       // Taking input single character at a time 
       c = fgetc(fp);   
       // Checking for end of file 
       if (feof(fp)){ 
         numDigits++;
         break ; 
       }
       numDigits++;
    }  while(1); 
     fclose(fp);
     printf("***The number of characters present in file is: %d \n",numDigits);
   printf("All Done.");
   return numDigits;
 }

1 个答案:

答案 0 :(得分:0)

循环问题:

                                 // problem code
int numDigits=0;
char c;      
do {                           
  c = fgetc(fp);   
  // Checking for end of file 
  if (feof(fp)){ 
    numDigits++;
    break ; 
  }
  numDigits++;
}  while(1); 
  • 按1减

    是时候退出了,无需在计数上加+1。

  • 将所有字符计数为数字

    没有测试来确定读取的字符是否是数字。

  • 退出条件不足

    在罕见的输入错误中,OP的代码会永远循环,fgetc(fp)返回EOFfeof(fp)为true。

  • 计数可能会轻易超过INT_MAX


一些修复:

// int numDigits=0;
unsigned long long numDigits = 0;
unsigned long long numCharacters = 0;
//char c;      
int c;  // fgetc() typically returns 257 different values    
do { 
  c = fgetc(fp);   
  // if (feof(fp)){ 
  //  numDigits++;
  //  break ; 
  // }
  if (c == EOF) {
    break;
  } 
  // numDigits++;
  if (isdigit(c)) numDigits++;
  numCharacters++;
}  while(1);