Как мне прочитать число из файла, чтобы получить размер в с - PullRequest
0 голосов
/ 03 декабря 2018

Для выполнения задания я должен создать 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;

}

Здесь я добавляю случайные числа в файл и работаю, я не добавляю пробелы, потому что все они должны быть одним очень длинным числом.Хотя у меня есть размер этой функции, который не является целью этой функции, и оператор печати будет закомментирован, как только следующая функция будет работать правильно.

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 голосов
/ 03 декабря 2018

Проблемы с циклом:

                                 // 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), возвращающим EOF и feof(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); 
...