Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/70.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C程序中文本文件的fscanf和fprintf更改的值_C - Fatal编程技术网

C程序中文本文件的fscanf和fprintf更改的值

C程序中文本文件的fscanf和fprintf更改的值,c,C,我想输出像“正确的输出数据”从“输入数据”下面的C程序。但结果表明,这些值的变化类似于“实际输出数据”。让我知道如何解决它 输入数据 -5190.978-90026.901158.6771590158 -5165.821-90011.875152.74215908954 -5158.762-90010.093148.0831808242 /***************************************************************************:::

我想输出像“正确的输出数据”从“输入数据”下面的C程序。但结果表明,这些值的变化类似于“实际输出数据”。让我知道如何解决它

输入数据
-5190.978-90026.901158.6771590158
-5165.821-90011.875152.74215908954
-5158.762-90010.093148.0831808242

/***************************************************************************:::
 xyz(ref)rgb2xyzrgb
    19/08/2016
 ver1.1 2009/3/7
 *******************************************************************************/
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <math.h>

int main(int argc,char *argv[])
{

    FILE *fpr,*fpw;
    int ref,r,g,b;
    float x,y,z;
    float n_x,n_y,n_z;

    /*****************************************************
         2.command line arguments processing
    *******************************************************/
    if(argc!=3)
    {
            fprintf(stderr,"Usage: %s (1)input_org.txt\n(2)write_xyz FILENAME\n",argv[0]);
            exit(1);
    }
    printf("OPEN FILE NAME:%s\n",argv[1]);

        /**********************************************************************************
         **********************************************************************************
         4.  FILE OPEN + Binary File Input
         **********************************************************************************
         *************************************************************************************/

    // open input file
    if((fpr=fopen(argv[1],"rt"))==NULL)
    {
        printf("file cannot be opened。\n");
        exit(1);
    }

    //write file
    if((fpw=fopen(argv[2],"wt"))==NULL)
    {
        fprintf(stderr,"DSM by GSI data.raw\n");
        exit(1);
    }

    while (fscanf(fpr,"%f %f %f %d %d %d %d", &x,&y,&z,&ref,&r,&g,&b) != EOF)
    {
        //printf("%.3f %.3f %.3f %d %d %d\n",x,y,z,r,g,b);
        n_x = roundf(x * 1000) / 1000;
        n_y = roundf(y * 1000) / 1000;
        n_z = roundf(z * 1000) / 1000;
        //printf("%.3f %.3f %.3f %d %d %d\n",n_x,n_y,n_z,r,g,b);        
        fprintf(fpw,"%.3f %.3f %.3f %d %d %d\n",n_x,n_y,n_z,r,g,b);
            //printf("x:%f y:%f z:%f\n", x,y,z);
    }

    fclose(fpr);
    fclose(fpw);

}
正确的输出数据
-5190.978-90026.901158.67790158
-5165.821-90011.875152.742908954
-5158.762-90010.093 148.083 80 82 42

/***************************************************************************:::
 xyz(ref)rgb2xyzrgb
    19/08/2016
 ver1.1 2009/3/7
 *******************************************************************************/
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <math.h>

int main(int argc,char *argv[])
{

    FILE *fpr,*fpw;
    int ref,r,g,b;
    float x,y,z;
    float n_x,n_y,n_z;

    /*****************************************************
         2.command line arguments processing
    *******************************************************/
    if(argc!=3)
    {
            fprintf(stderr,"Usage: %s (1)input_org.txt\n(2)write_xyz FILENAME\n",argv[0]);
            exit(1);
    }
    printf("OPEN FILE NAME:%s\n",argv[1]);

        /**********************************************************************************
         **********************************************************************************
         4.  FILE OPEN + Binary File Input
         **********************************************************************************
         *************************************************************************************/

    // open input file
    if((fpr=fopen(argv[1],"rt"))==NULL)
    {
        printf("file cannot be opened。\n");
        exit(1);
    }

    //write file
    if((fpw=fopen(argv[2],"wt"))==NULL)
    {
        fprintf(stderr,"DSM by GSI data.raw\n");
        exit(1);
    }

    while (fscanf(fpr,"%f %f %f %d %d %d %d", &x,&y,&z,&ref,&r,&g,&b) != EOF)
    {
        //printf("%.3f %.3f %.3f %d %d %d\n",x,y,z,r,g,b);
        n_x = roundf(x * 1000) / 1000;
        n_y = roundf(y * 1000) / 1000;
        n_z = roundf(z * 1000) / 1000;
        //printf("%.3f %.3f %.3f %d %d %d\n",n_x,n_y,n_z,r,g,b);        
        fprintf(fpw,"%.3f %.3f %.3f %d %d %d\n",n_x,n_y,n_z,r,g,b);
            //printf("x:%f y:%f z:%f\n", x,y,z);
    }

    fclose(fpr);
    fclose(fpw);

}
实际输出数据
-5190.978-90026.898158.67790858
-5165.821-90011.875152.742908954
-5158.762-90010.094 148.083 80 82 42

/***************************************************************************:::
 xyz(ref)rgb2xyzrgb
    19/08/2016
 ver1.1 2009/3/7
 *******************************************************************************/
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <math.h>

int main(int argc,char *argv[])
{

    FILE *fpr,*fpw;
    int ref,r,g,b;
    float x,y,z;
    float n_x,n_y,n_z;

    /*****************************************************
         2.command line arguments processing
    *******************************************************/
    if(argc!=3)
    {
            fprintf(stderr,"Usage: %s (1)input_org.txt\n(2)write_xyz FILENAME\n",argv[0]);
            exit(1);
    }
    printf("OPEN FILE NAME:%s\n",argv[1]);

        /**********************************************************************************
         **********************************************************************************
         4.  FILE OPEN + Binary File Input
         **********************************************************************************
         *************************************************************************************/

    // open input file
    if((fpr=fopen(argv[1],"rt"))==NULL)
    {
        printf("file cannot be opened。\n");
        exit(1);
    }

    //write file
    if((fpw=fopen(argv[2],"wt"))==NULL)
    {
        fprintf(stderr,"DSM by GSI data.raw\n");
        exit(1);
    }

    while (fscanf(fpr,"%f %f %f %d %d %d %d", &x,&y,&z,&ref,&r,&g,&b) != EOF)
    {
        //printf("%.3f %.3f %.3f %d %d %d\n",x,y,z,r,g,b);
        n_x = roundf(x * 1000) / 1000;
        n_y = roundf(y * 1000) / 1000;
        n_z = roundf(z * 1000) / 1000;
        //printf("%.3f %.3f %.3f %d %d %d\n",n_x,n_y,n_z,r,g,b);        
        fprintf(fpw,"%.3f %.3f %.3f %d %d %d\n",n_x,n_y,n_z,r,g,b);
            //printf("x:%f y:%f z:%f\n", x,y,z);
    }

    fclose(fpr);
    fclose(fpw);

}
/************************************************************************************************************************************:::
xyz(参考)rgb2xyzrgb
19/08/2016
2009年1月1日至3月7日
*******************************************************************************/
#包括
#包括
#包括
#包括
int main(int argc,char*argv[])
{
文件*fpr,*fpw;
内部参考,r,g,b;
浮动x,y,z;
浮动n_x,n_y,n_z;
/*****************************************************
2.命令行参数处理
*******************************************************/
如果(argc!=3)
{
fprintf(stderr,“用法:%s(1)input_org.txt\n(2)write_xyz FILENAME\n”,argv[0]);
出口(1);
}
printf(“打开的文件名:%s\n”,argv[1]);
/**********************************************************************************
**********************************************************************************
4.文件打开+二进制文件输入
**********************************************************************************
*************************************************************************************/
//打开输入文件
if((fpr=fopen(argv[1],“rt”))==NULL)
{
printf(“无法打开文件。\n”);
出口(1);
}
//写入文件
if((fpw=fopen(argv[2],“wt”))==NULL)
{
fprintf(stderr,“GSI数据的DSM.raw\n”);
出口(1);
}
而(fscanf(fpr,“%f%f%f%d%d%d%d”、&x、&y、&z、&ref、&r、&g、&b)!=EOF)
{
//printf(“%.3f%.3f%.3f%d%d%d\n”,x,y,z,r,g,b);
n_x=整数(x*1000)/1000;
n_y=roundf(y*1000)/1000;
n_z=roundf(z*1000)/1000;
//printf(“%.3f%.3f%.3f%d%d%d\n”,n_x,n_y,n_z,r,g,b);
fprintf(fpw,“%.3f%.3f%.3f%d%d%d\n”,n_x,n_y,n_z,r,g,b);
//printf(“x:%f y:%f z:%f\n”,x,y,z);
}
fclose(fpr);
fclose(fpw);
}

而不是
-90026.901
计算机存储最接近精度的数字。它是
90026.898
。请记住,在计算机上,数字是以二进制形式存储的,
901/1000
不是有限二进制形式。由于这个原因,一些精度将被降低

如果您尝试打印
1/3
,则情况相同。它不会打印出所有的数字,但实际上您希望它,因为您已经习惯了十进制。在二进制系统中,一些具有有限十进制形式的分数不会有一个

解决方案是什么?始终尝试放大
macheps
,这是算术精度。最简单的方法是使用
double
而不是
float
。它仍然不能给出100%,但更有可能会起作用


这个主题被称为
科学计算
,对于程序员来说是一个痛苦的**。

不要使用
浮点
。始终(是,始终)使用
double
。请记住使用
round()
而不是
roundf()
,并更改
scanf()中的转换说明符
。通过将float改为double,错误得以解决。通过您的解释,我理解了错误的原因。@LenItsuki然后请单击答案下的灰色箭头将其标记为有用score@xenteros从字面上看,你要求的是否决票,因为分数下面的箭头就是这样做的我猜你的意思是打勾。事实上,如果投反对票,我们将不胜感激。我会成为无名英雄:D当然你是对的。幸运的是,他还不能投反对票。我想向上推箭头,但推箭头不起作用,因为我的声誉不到15。