如何解决需要帮助实现一个代码,将用户输入的输入和答案的输出保存在文本文件中
我创建了一个代码,可以将小数转换为浮点数,将浮点数转换为小数。我所需要的只是添加一个我不确定如何添加以及在哪里添加的代码。但我需要实现一个代码,将所有用户的输入和答案的输出保存到一个文本文件(如记事本)中。以下是我的代码:
#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 举报,一经查实,本站将立刻删除。