C-从文件中操作浮点
我正在为我的一个基于C语言的课程做作业 这是任务的目标: 作业: 从文件中读取浮点数,并在小数点后输出2位数字。数字在小数点前至少应有8位数字。然后,从小数点之前的偶数位置提取所有数字。按相反顺序打印。然后从小数点之前提取奇数位置的所有数字,并按出现顺序打印 例如: 你的电话号码是:12345678.99 按相反顺序打印的偶数定位数字–8 6 4 2 按顺序打印的奇数位数字–1 3 5 7 我的代码(到目前为止)如下:C-从文件中操作浮点,c,C,我正在为我的一个基于C语言的课程做作业 这是任务的目标: 作业: 从文件中读取浮点数,并在小数点后输出2位数字。数字在小数点前至少应有8位数字。然后,从小数点之前的偶数位置提取所有数字。按相反顺序打印。然后从小数点之前提取奇数位置的所有数字,并按出现顺序打印 例如: 你的电话号码是:12345678.99 按相反顺序打印的偶数定位数字–8 6 4 2 按顺序打印的奇数位数字–1 3 5 7 我的代码(到目前为止)如下: #include <stdio.h> #define INPU
#include <stdio.h>
#define INPUT_FILE "FloatNumber.txt"
int main ()
{
//Variables for the digits BEFORE the decimal point
int ldig1 = 0, ldig2 = 0, ldig3 = 0, ldig4 = 0, ldig5 = 0, ldig6 = 0, ldig7 = 0, ldig8 = 0;
//Variable for the float number in the text file
float txtFloat;
FILE *fp = NULL;
fp = fopen(INPUT_FILE, "r"); //because we are just reading from a file... the float is already written there
fscanf(fp, "%.2f", &txtFloat);
//Print the number that is currently in the text file
printf("Your number is: %.2f\n", txtFloat);
//Extract first 8 digits (before decimal)
ldig8 = (int)txtFloat % 10;
txtFloat /= 10;
//Extract last 7 digits (before decimal)
ldig7 = (int)txtFloat % 10;
txtFloat /= 10;
//Extract last 6 digits (before decimal)
ldig6 = (int)txtFloat % 10;
txtFloat /= 10;
//Extract last 5 digits (before decimal)
ldig5 = (int)txtFloat % 10;
txtFloat /= 10;
//Extract last 4 digits (before decimal)
ldig4 = (int)txtFloat % 10;
txtFloat /= 10;
//Extract last 3 digits (before decimal)
ldig3 = (int)txtFloat % 10;
txtFloat /= 10;
//Extract last 2 digits (before decimal)
ldig2 = (int)txtFloat % 10;
txtFloat /= 10;
//Extract last digits (before decimal)
ldig1 = (int)txtFloat % 10;
txtFloat /= 10;
//Print the digits in even positions in REVERSE order
printf("Even positioned digits printed in reverse order: %d %d %d %d\n", ldig8, ldig6, ldig4, ldig2);
//Print the digits in odd positions in REGULAR order
printf("Odd positioned digits printed in order: %d %d %d %d\n", ldig7, ldig5, ldig3, ldig1);
//Close the file
fclose(fp);
}
输出应与上述示例类似,但我得到的是以下输出:
你的电话号码是:0.00
按相反顺序打印的偶数位数字:0
按顺序打印的奇数位数字:0
我相当肯定我的问题与打字有关。如您所见,我已将txtFloat
键入为int,因为这是执行模运算的唯一方法。但我认为这可能就是为什么我的输出都是零的原因
此外,我正在Windows上使用WinSCP、PuTTY和Notepad++运行此程序。我还没有机会在实际的Linux操作系统上运行它。我在某个地方读到,Windows和Linux之间的文本文件配置不同,所以这可能是另一个问题?我确信我的代码中还有其他问题,而且我对编程也比较陌生。关于我做错了什么,或者我可以改变什么来纠正这个问题,有什么想法吗?提前谢谢
(这也是我在该网站上的第一篇帖子,对于我可能犯下的任何格式错误,我深表歉意)。将
“%.2f”
格式字符串传递到fscanf
是无效的。只需将其替换为“%f”
。还要确保文件采用单字节编码。将数字作为字符串读取并修复字符串会更容易。但是你们的老师可能觉得不太有趣。哈哈,我不认为这能让我走得更远。对于此特定赋值,禁止使用数组和/或字符串。调用fopen()函数时,请始终检查(!=NULL)返回值,以确保此语句的操作成功:fscanf(fp,.2f,&txtFloat)代码>建议读取整个浮点数,即fscanf(fp、%f、&txtFloat)代码>调用fscanf()函数时,始终检查返回值(而不是参数值),以确保操作成功。即如果(1!=fscanf(fp,%.2f,&txtFloat)){//handle error and exit}
变量textFloat是一个浮点,因此除以一个浮点,即txtFloat/=10.0f代码>谢谢你!将“%.2f”
更改为简单的“%f”
解决了我在输出中的零问题。但是现在,当我使用小数点后除了“00”以外的任何数字时,输出是不正确的。例如,“12345678.99”输出:您的号码是:12345679.00按相反顺序打印的偶数位数字:9 6 4 2按顺序打印的奇数位数字:7 5 3 1
12345678.99