2017-01-04 4 views
0

Мое первое сообщение :) Я написал небольшую программу, в которой я прочитал значение из текстового файла и сделаю его напечатанным как есть, а затем напечатаю его эквивалентное двоичное значение Но что Я столкнулся с проблемой - значение, которое я печатаю, отличается от значения, указанного в файле , например. У меня есть 23 в моем текстовом файле, и когда я пытаюсь прочитать его и распечатать значение, которое я получаю 1 , у кого-то есть представление о том, чего мне не хватает или где я ошибаюсь. Я отправляю мой код здесь Спасибо заранееНе читайте правильное значение при обработке файлов в C

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





char number_read = 0; 
char number = 0; 
char number_of_ones = 0; 
char remainder_value = 0; 
char binary = 0; 
char base = 0; 



    int main() 

{ 
    FILE *fp; 


    fp = fopen ("File.txt","r"); 

    while(1) 
    { 
     number_read = fgetc(fp); 

     if(feof(fp)) 
     { 
     break ; 
     } 

     printf("\nnumber is=%c", number_read); 

     while (number_read>0) 
     { 
     remainder_value = number_read % 2; 
     /* To count no.of 1s */ 
     if (remainder_value == 1) 
     { 
      number_of_ones++; 
     } 

     binary = binary + remainder_value * base; 
     number_read = number_read/2; 
     base = base * 10; 

     } 


    }  
    fprintf("\nINPUT number is = %d\n", number); 
    fprintf("\nIt's in the binary number is = %d\n", binary); 
    fprintf("\nNo.of 1's in the binary number is = %d\n", number_of_ones); 

    fclose(fp); 

    return 0; 
} 
+2

Когда вы читаете характер, как «1», вы получаете значение ASCII, соответствующее этот глиф в наборе символов ... не целое число 1. Вы должны конвертировать из ASCII в целочисленный эквивалент перед его использованием для арифметических операций. –

ответ

1

аргументов, переданных fprintf функции в вашем случае это не так. Измените часть на следующее:

fprintf(fp,"\nINPUT number is = %d\n", number); 
fprintf(fp,"\nIt's in the binary number is = %d\n", binary); 
fprintf(fp,"\nNo.of 1's in the binary number is = %d\n",number_of_ones); 

Так добавить fp в качестве первого аргумента fprintf.

и получить целое значение символа number_read, использовать функции atoi предоставленных в C. (Проверьте this для справки.)

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

char number_read = 0; 
int number = 0; 
int number_of_ones = 0; 
int remainder_value = 0; 
int binary = 0; 
int base = 1; 

int main(){ 
FILE *fp = fopen("File.txt", "r"); 

    while (1){ 
     number_read = fgetc(fp); 

     if (feof(fp)){ 
      break; 
     } 
     base = 1; 
     number_of_ones = remainder_value = binary = 0; 

     printf("\nnumber is=%c\n", number_read); 
     number = number_read-48; 

     while (number>0){ 
      remainder_value = number % 2; 
      /* To count no.of 1s */ 
      if (remainder_value == 1){ 
       number_of_ones++; 
      } 

      binary = binary + remainder_value * base; 
      number = number/ 2; 
      base = base * 10; 
      if (number == 1){ 
       binary = binary + 1 * base; 
       number = 0; 
      } 
     } 
     printf("\nINPUT number is = %d\n", number_read-48); 
     printf("\nIt's in the binary number is = %d\n", binary); 
     printf("\nNo.of 1's in the binary number is = %d\n", number_of_ones); 

    } 
return 0; 
} 
+0

, пожалуйста, объясните, почему этот код решает вопрос. –

+0

, пока вы получаете значение ASCII в наборе символов. Преобразуйте то же самое в целочисленный эквивалент, прежде чем использовать его для арифметических операций. –

+1

@VimalBhaskar: Не делает он это здесь: 'number = number_read-48;'? – alk

0

@Garryp,

Я гавань коснулся логике программы, я не понимаю причину, по которой вы сохранили базу как 0 или всю переменную числа в char, которая может быть легко реализована с использованием самой переменной int. Единственная проблема, с которой вы столкнулись, - это работа с файлами, и, пожалуйста, найдите обновленный код. Также почему «переменная числа» используется без необходимости?

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

int number_read = 0; 
char number = 0; 
int number_of_ones = 0; 
int remainder_value = 0; 
int binary = 0; 
int base = 1; 

int main() 

{ 
FILE *fp,*fp1; 
char buff[5]; 

fp = fopen("C:\\Users\\50022314\\Desktop\\mytest.txt", "r+"); 
fp1 = fopen("C:\\Users\\50022314\\Desktop\\mytest1.txt", "a+"); 
while (fgets(buff, sizeof(buff), fp) != NULL) 
{ 
    number_read = atoi(buff); 
    printf("\nnumber is=%d", number_read); 
    while (number_read > 0) 
    { 
     remainder_value = number_read % 2; 
     /* To count no.of 1s */ 
     if (remainder_value == 1) 
     { 
      number_of_ones++; 
     } 

     binary = binary + remainder_value * base; 
     number_read = number_read/2; 
     base = base * 10; 

    } 


    fprintf(fp1, "\nINPUT number is = %d\n", number); 
    fprintf(fp1, "\nIt's in the binary number is = %d\n", binary); 
    fprintf(fp1, "\nNo.of 1's in the binary number is = %d\n", number_of_ones); 
} 
fclose(fp); 
fclose(fp1); 
return 0; 
} 
+0

Вы можете сделать проверку возвращаемых значений из 'fopen' (и' fprintf' также) –

0

Здравствуйте и спасибо за ответ на мой пост Я проверил, что я сделал неправильно, и вот мой код, который работает хорошо я отправил к для дальнейшего использования для стека последователя

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

вот мой код:

#include <stdio.h> 
#include <stdlib.h> 
#include <conio.h> 
#include <string.h> 
#define BUFFER 5 



char number_read = 0; 
char number_of_ones = 0; 
char remainder_value = 0; 
char binary = 0; 
char base = 0; 
char buff[BUFFER]; 



int main() 

{ 
    FILE *fp;     //file pointer fp 
    fp = fopen("File.txt","r+"); 

    while (fgets(buff, sizeof(buff), fp) != NULL) 
    { 
     number_read = atoi(buff);     //ASCII to integer 
     printf("\nnumber is=%d", number_read); 
     while (number_read > 0) 
     { 
     remainder_value = number_read % 2; 
     /* To count no.of 1s */ 
     if (remainder_value == 1) 
      { 
      number_of_ones++; 
      } 

      binary = binary + remainder_value * base; 
      number_read = number_read/2; 
      base = base * 10; 
     } 
     printf("\nNo.of 1's in It's binary representation is = %d\n",number_of_ones); 
     number_of_ones = 0; 
    } 

    fclose(fp); 
    return 0; 
} 
+0

Можете ли вы все дать мне, пожалуйста, пожалуйста? Я больше не могу задавать вопрос ... – Garryp