微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

需要帮助实现一个代码,将用户输入的输入和答案的输出保存在文本文件中

如何解决需要帮助实现一个代码,将用户输入的输入和答案的输出保存在文本文件中

我创建了一个代码,可以将小数转换为浮点数,将浮点数转换为小数。我所需要的只是添加一个我不确定如何添加以及在哪里添加代码。但我需要实现一个代码,将所有用户的输入和答案的输出保存到一个文本文件(如记事本)中。以下是我的代码

#include <stdio.h>
#include <math.h>

/*************************/
void decimal_to_IEEE754()
{
   /* declare local variables */
   float decimal_number;
   int exponent = 0;
   int bit[32];
   for (int i = 0; i < 32; i++) bit[i] = 0;

   /* prompt for floating point decimal number */
   printf("\nEnter the decimal representation: ");
   scanf("%f",&decimal_number);
   if (decimal_number == 0)
   {
       printf("\n*** Sign: 0");
       printf("\n*** Biased exponent : 00000000");
       printf("\n*** Mantissa : 00000000000000000000000");
       printf("\n***The IEEE - 754 representation is : 0.000000");
       return;
   }
      
   /* Check for 0--if so,print result */
   /* Print sign: if number>0,sign is 0,else 1 */
   if (decimal_number < 0){
       printf("\n*** Sign: %d",1);
       bit[31] = 1;
   }
   else{
       bit[31] = 0;
       printf("\n*** Sign: %d",0);
   }

   /* take absolute value of number before generating significand */
   if (decimal_number < 0) decimal_number = -decimal_number;

   /* normalize number:
   while number >2,divide by 2,increment exponent
   while number <1,multiply by 2,decrement exponent
   */
   while (decimal_number > 2)
   {
       decimal_number = decimal_number / 2;
       exponent = exponent + 1;
   }
   while (decimal_number < 1)
   {
       decimal_number = decimal_number * 2;
       exponent = exponent - 1;
   }

   /* Bias exponent by 127 and print each bit in binary with 8-iteration for-looP*/
   exponent = exponent + 127;
   printf("\n*** Biased exponent: ");
   int i = 23;
   while (exponent)
   {
       bit[i] = exponent % 2;
       exponent = exponent / 2;
       i++;
   }
   for (i = 30; i >=23; i--)
   {
       printf("%d",bit[i]);
   }
   /* Hide 1 and print significand in binary with 23-iteration for-looP*/
   decimal_number = decimal_number - 1;
   printf("\n*** Mantissa: ");
   for (i = 22; i >= 0;i--)
   {
       decimal_number = decimal_number * 2;
       if (decimal_number>=1)
       {
           bit[i] = 1;
           decimal_number = decimal_number - 1;
       }
       else
       {
           bit[i] = 0;
       }
       printf("%d",bit[i]);
   }

   /* Print IEEE-754 representation */
   printf("\n*** IEEE HEX: ");
   for (i = 31; i > 0; i = i - 4)
   {
             if (bit[i] == 1 && bit[i - 1] == 1 && bit[i - 2] == 1 && bit[i - 3] == 1) printf("F");
       else if (bit[i] == 1 && bit[i - 1] == 1 && bit[i - 2] == 1 && bit[i - 3] == 0) printf("E");
       else if (bit[i] == 1 && bit[i - 1] == 1 && bit[i - 2] == 0 && bit[i - 3] == 1) printf("D");
       else if (bit[i] == 1 && bit[i - 1] == 1 && bit[i - 2] == 0 && bit[i - 3] == 0) printf("C");
       else if (bit[i] == 1 && bit[i - 1] == 0 && bit[i - 2] == 1 && bit[i - 3] == 1) printf("B");
       else if (bit[i] == 1 && bit[i - 1] == 0 && bit[i - 2] == 1 && bit[i - 3] == 0) printf("A");
       else if (bit[i] == 1 && bit[i - 1] == 0 && bit[i - 2] == 0 && bit[i - 3] == 1) printf("9");
       else if (bit[i] == 1 && bit[i - 1] == 0 && bit[i - 2] == 0 && bit[i - 3] == 0) printf("8");
       else if (bit[i] == 0 && bit[i - 1] == 1 && bit[i - 2] == 1 && bit[i - 3] == 1) printf("7");
       else if (bit[i] == 0 && bit[i - 1] == 1 && bit[i - 2] == 1 && bit[i - 3] == 0) printf("6");
       else if (bit[i] == 0 && bit[i - 1] == 1 && bit[i - 2] == 0 && bit[i - 3] == 1) printf("5");
       else if (bit[i] == 0 && bit[i - 1] == 1 && bit[i - 2] == 0 && bit[i - 3] == 0) printf("4");
       else if (bit[i] == 0 && bit[i - 1] == 0 && bit[i - 2] == 1 && bit[i - 3] == 1) printf("3");
       else if (bit[i] == 0 && bit[i - 1] == 0 && bit[i - 2] == 1 && bit[i - 3] == 0) printf("2");
       else if (bit[i] == 0 && bit[i - 1] == 0 && bit[i - 2] == 0 && bit[i - 3] == 1) printf("1");
       else if (bit[i] == 0 && bit[i - 1] == 0 && bit[i - 2] == 0 && bit[i - 3] == 0) printf("0");
   }
   return;
}

/***********************************************************************/
void IEEE754_to_decimal()
{
   /* declare local variables */
   char IEEE_char[20];
   int bit[32];
   float fraction = 0.0;
   int exponent=0;
   float number;
   /* prompt for IEEE-754 representation */
   printf("\nEnter the IEEE-754 representation:");
   scanf("%s",IEEE_char);

   /* check for special cases: NaN
   if so,print and return */
   int j = 0;
   int NaN_flag=0;
   while (IEEE_char[j] && j < 20)
   {
       if (j >= 8) { NaN_flag = 1; break; }
       if (!((IEEE_char[j] >= 'A' && IEEE_char[j] <= 'F') || (IEEE_char[j]>='0' && IEEE_char[j]<='9')))
       {
           NaN_flag = 1; break;
       }
       j++;
   }

   if (NaN_flag == 1)
   {
       printf("\n*** Sign: -");
       printf("\n*** Special case: NaN");
       return;
   }

   /*binary bit calculation*/
   j = 31;
   for (int i = 0; i < 8; i++)
   {
       if (IEEE_char[i] == 'F'){ bit[j] = 1; bit[j - 1] = 1; bit[j - 2] = 1; bit[j - 3] = 1; }
       else if (IEEE_char[i] == 'E'){ bit[j] = 1; bit[j - 1] = 1; bit[j - 2] = 1; bit[j - 3] = 0; }
       else if (IEEE_char[i] == 'D'){ bit[j] = 1; bit[j - 1] = 1; bit[j - 2] = 0; bit[j - 3] = 1; }
       else if (IEEE_char[i] == 'C'){ bit[j] = 1; bit[j - 1] = 1; bit[j - 2] = 0; bit[j - 3] = 0; }
       else if (IEEE_char[i] == 'B'){ bit[j] = 1; bit[j - 1] = 0; bit[j - 2] = 1; bit[j - 3] = 1; }
       else if (IEEE_char[i] == 'A'){ bit[j] = 1; bit[j - 1] = 0; bit[j - 2] = 1; bit[j - 3] = 0; }
       else if (IEEE_char[i] == '9'){ bit[j] = 1; bit[j - 1] = 0; bit[j - 2] = 0; bit[j - 3] = 1; }
       else if (IEEE_char[i] == '8'){ bit[j] = 1; bit[j - 1] = 0; bit[j - 2] = 0; bit[j - 3] = 0; }
       else if (IEEE_char[i] == '7'){ bit[j] = 0; bit[j - 1] = 1; bit[j - 2] = 1; bit[j - 3] = 1; }
       else if (IEEE_char[i] == '6'){ bit[j] = 0; bit[j - 1] = 1; bit[j - 2] = 1; bit[j - 3] = 0; }
       else if (IEEE_char[i] == '5'){ bit[j] = 0; bit[j - 1] = 1; bit[j - 2] = 0; bit[j - 3] = 1; }
       else if (IEEE_char[i] == '4'){ bit[j] = 0; bit[j - 1] = 1; bit[j - 2] = 0; bit[j - 3] = 0; }
       else if (IEEE_char[i] == '3'){ bit[j] = 0; bit[j - 1] = 0; bit[j - 2] = 1; bit[j - 3] = 1; }
       else if (IEEE_char[i] == '2'){ bit[j] = 0; bit[j - 1] = 0; bit[j - 2] = 1; bit[j - 3] = 0; }
       else if (IEEE_char[i] == '1'){ bit[j] = 0; bit[j - 1] = 0; bit[j - 2] = 0; bit[j - 3] = 1; }
       else if (IEEE_char[i] == '0'){ bit[j] = 0; bit[j - 1] = 0; bit[j - 2] = 0; bit[j - 3] = 0; }
       j = j - 4;
   }

   /* Mask biased exponent and significand from number */
   for (int i = 0; i <= 22; i++)
   {
       fraction = (fraction + bit[i]) / ((float)2.0);
   }
   for (int i = 30; i >= 23; i--)
   {
       exponent = exponent * 2 + bit[i];
   }

   /* check for special cases: 0,-0,+infinity,-infinity,NaN
   if so,print and return */
   if (exponent == 255 && fraction == (float)0.0)
   {
       if (bit[31]) {
           printf("\n*** Sign: -");
           printf("\n*** Special case: -infinity");
       }
       else
       {
           printf("\n*** Sign: +");
           printf("\n*** Special case: +infinity");
       }
       return;
   }
   else if (exponent == 255 && fraction != (float)0.0)
   {
       printf("\n*** Sign: -");
       printf("\n*** Special case: NaN");
       return;
   }
   else if (exponent == 0 && fraction == (float)0.0)
   {
       if (bit[31]) {
           printf("\n*** Sign: -");
           printf("\n*** Special case: -0");
       }
       else
       {
           printf("\n*** Sign: +");
           printf("\n*** Special case: +0");
       }
       return;
   }
   /* Mask sign from number: if sign=0,print "+",else print "-" */
   printf("\n*** Sign: ");
   if (bit[31] == 1) printf("-");
   else            printf("+");


   /* If biased exponent=0,number is denormalized with unbiased exponent of -126,print denormalized number as fraction * 2^(-126),return */
   if (exponent == 0)
   {
       printf("\n*** denormalized number: %f*2^(-126)",fraction);
       return;
   }
   /* Unbias exponent by subtracting 127 and print */
   exponent = exponent - 127;
   printf("\n*** Unbiased exponent: %d",exponent);
   /* Add hidden 1 and print normalized decimal number */
   fraction = fraction + 1;
   printf("\n*** normalized decimal: %f",fraction);
   /* Print decimal number */
   number = fraction*pow(2.0,(double)exponent);
   if (bit[31]) printf("\n*** Decimal: -%f",number);
   else         printf("\n*** Decimal: %f",number);

   return;

}

int main()
{
   /* declare local variables */
   int selection=0;
   /* until user chooses to quit,prompt for choice and select appropriate function */
   while (selection != 3)
   {
       printf("\nFloating-point conversion:");
       printf("\n1) Decimal to IEEE-754 conversion");
       printf("\n2) IEEE-754 to Decimal conversion");
       printf("\n3) Exit");
       printf("\nEnter selection: ");
       scanf("%d",&selection);
       switch (selection)
       {
           case 1:
           {
                      decimal_to_IEEE754();
                      break;
           }
           case 2:
           {
                      IEEE754_to_decimal();
                      break;
           }
           case 3:
           {
                      break;
           }
       }
   }
   printf("\n*** Program Terminated normally");
   return 0;
}

解决方法

您可以使用 C 中可用的文件 I/O 操作。

    #include<stdlib.h>




    int main()
    {
       /* declare local variables */
       int selection=0;
       /* until user chooses to quit,prompt for choice and select appropriate function */

       // Setup File pointer
       FILE* outputfile;      // File pointer for input file

       outputfile   = fopen ("fileout.txt","w+");    // open a file with filename as fileout.txt in read/write mode


       while (selection != 3)
       {
           printf("\nEnter selection: ");
           scanf("%d",&selection);
           fprintf(outputfile,"%d\t",selection);   // write the input value to file with tab charecter for seperation
           switch (selection)
           {
               case 1:
               {
                          decimal_to_IEEE754(outputfile);
                          break;
               }
               case 2:
               {
                          IEEE754_to_decimal(outputfile);
                          break;
               }
               case 3:
               {
                          break;
               }
           }
       }

       fclose(outputfile);   // close te file


       printf("\n*** Program Terminated Normally");
       return 0;
    }

重要的一点,鉴于您的函数声明的性质,它不返回任何值,因此您需要修改函数以接受文件指针作为输入参数,以便在调用相应函数时写入值。

  void decimal_to_IEEE754(FILE* outputfile);
void IEEE754_to_decimal(FILE* outputfile);

在函数内部,您可以使用相同的函数调用将输出值写入文件,使用与打印它们相同的逻辑。

在 IEEE754_to_decimal() 中

fprintf(outputfile,"%f\n",number); //  value followed by newline at end

要将字符值写入文件,您可以在decimal_to_IEEE754() 内的fprintf 函数中使用'%c' 而不是'%f'。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。