C++ 为什么从fscanf读取不正确的数据?

C++ 为什么从fscanf读取不正确的数据?,c++,c,C++,C,我试图通过fscanf从文件中读取数据,然后打印数据。 然而,有些数据是不正确的。有四列。只有第三列数据有问题。另一列没有问题 正确读取文件中的小数据,但大数据饱和到26843519。它看起来有数据类型限制。但编号26843519不是特定数据类型的限制编号 我正在尝试更改许多数据类型。我仍然无法解决这个问题 你能帮忙吗 编译和运行系统: I7-4790,ubuntu 14.04.1 x86_64,gcc(g++)4.8.4 资料来源: 输入数据文件: (第三列是个问题。) 输出结果(通过prin

我试图通过fscanf从文件中读取数据,然后打印数据。 然而,有些数据是不正确的。有四列。只有第三列数据有问题。另一列没有问题

正确读取文件中的小数据,但大数据饱和到26843519。它看起来有数据类型限制。但编号26843519不是特定数据类型的限制编号

我正在尝试更改许多数据类型。我仍然无法解决这个问题

你能帮忙吗

编译和运行系统: I7-4790,ubuntu 14.04.1 x86_64,gcc(g++)4.8.4

资料来源: 输入数据文件: (第三列是个问题。)

输出结果(通过printf): (第三个数据将输出到“位置”。)


你的(更新的)代码对我有用。在任何情况下,整数大小都不是问题,除非您使用的是非常奇怪的体系结构。第一个出错的值是383496192,可以用28位表示(2^29=536870912)

你的(更新的)代码对我有用。在任何情况下,整数大小都不是问题,除非您使用的是非常奇怪的体系结构。第一个出错的值是383496192,可以用28位表示(2^29=536870912)

如果存在架构影响整数大小的问题,则可以使用
stdint.h
提供的精确大小整数表示法以及
inttypes.h
中的扫描和打印宏。例如,您的代码可以重写为:

#include <stdio.h>
#include <stdint.h>     /* for uintX_t       */
#include <inttypes.h>   /* for SCNtX & PRItX */

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

    double time;
    uint64_t location;          /* exact size variables */
    uint32_t req_size, temp; 
    char op_type[10];
    FILE *fp = argc > 1 ? fopen (argv[1], "r") : stdin;

    if (!fp) {  /* validate file open for reading */
        fprintf (stderr, "error: file open failed '%s'.\n", argv[1]);
        return 1;
    }

    /* using SCN with fscanf and PRI with printf */
    while (fscanf (fp, "%lf %s %" SCNu64 " %" SCNu32 " %" SCNu32 "", 
                &time, op_type, &location, &req_size, &temp) == 5)
        printf ("[Application] OP : %s    Location : %10" PRIu64 "   "
                "  Time : %.0lf    Size : %5" PRIu32 "\n", op_type, 
                location, time, req_size);

    if (fp != stdin) fclose (fp);     /* close file if not stdin */

    return 0;
}
#包括
#包括/*用于uintX\u t*/
#包括/*用于SCNtX和PRItX*/
int main(int argc,字符**argv){
双倍时间;
uint64\u t位置;/*精确大小变量*/
uint32要求的尺寸、温度;
char op_类型[10];
文件*fp=argc>1?fopen(argv[1],“r”):stdin;
如果(!fp){/*验证文件是否打开以进行读取*/
fprintf(stderr,“错误:文件打开失败“%s”。\n”,argv[1]);
返回1;
}
/*将SCN与fscanf一起使用,将PRI与printf一起使用*/
而(fscanf(fp),%lf%s%“SCNu64”%“SCNu32”%“SCNu32”,
&时间、操作类型、位置、需求大小和温度)==5)
printf(“[应用程序]操作:%s位置:%10”PRIu64”
“时间:%.0lf大小:%5”PRIu32“\n”,操作类型,
位置、时间、需求大小);
如果(fp!=stdin)fclose(fp);/*如果不是stdin,则关闭文件*/
返回0;
}
这将消除任何存储大小差异

示例使用/输出

$ ./bin/readloc <dat/location.txt
[Application] OP : Read    Location :  383496192     Time : 128166477394345568    Size : 32768
[Application] OP : Read    Location :    2822144     Time : 128166483087163648    Size : 65536
[Application] OP : Read    Location : 3221266432     Time : 128166620794097840    Size :  4096
[Application] OP : Read    Location :    3354624     Time : 128166624207799328    Size : 49152
[Application] OP : Read    Location :    2961408     Time : 128166624207887072    Size : 57344
[Application] OP : Read    Location :  368979968     Time : 128166624210238736    Size : 65536
[Application] OP : Read    Location :  395730944     Time : 128166624211812800    Size : 65536
[Application] OP : Read    Location :  442093568     Time : 128166624211962704    Size : 65536
[Application] OP : Read    Location :  437964800     Time : 128166624211968352    Size : 65536
[Application] OP : Read    Location :  396734464     Time : 128166624212755744    Size : 49152
[Application] OP : Read    Location :  386232320     Time : 128166624212868368    Size : 20480
[Application] OP : Read    Location :  398438400     Time : 128166624212905984    Size : 45056
[Application] OP : Read    Location :  378523648     Time : 128166624213527424    Size : 65536
[Application] OP : Read    Location :  404738048     Time : 128166624213988224    Size : 65536
[Application] OP : Read    Location :  404475904     Time : 128166624213996448    Size : 65536
[Application] OP : Read    Location :  381739008     Time : 128166624232905616    Size : 65536
[Application] OP : Read    Location :  439144448     Time : 128166624242878896    Size : 57344
[Application] OP : Read    Location :    3608576     Time : 128166624242935248    Size : 57344
[Application] OP : Read    Location :  386646016     Time : 128166624243149616    Size : 65536
[Application] OP : Read    Location :  398176256     Time : 128166624243365008    Size : 65536
[Application] OP : Read    Location :  397676544     Time : 128166624274398032    Size : 32768
[Application] OP : Read    Location :    6320128     Time : 128166624295029088    Size : 65536

$./bin/readloc如果存在架构影响整数大小的问题,则可以使用
stdint.h
提供的精确大小整数表示法以及
inttypes.h
中的扫描和打印宏。例如,您的代码可以重写为:

#include <stdio.h>
#include <stdint.h>     /* for uintX_t       */
#include <inttypes.h>   /* for SCNtX & PRItX */

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

    double time;
    uint64_t location;          /* exact size variables */
    uint32_t req_size, temp; 
    char op_type[10];
    FILE *fp = argc > 1 ? fopen (argv[1], "r") : stdin;

    if (!fp) {  /* validate file open for reading */
        fprintf (stderr, "error: file open failed '%s'.\n", argv[1]);
        return 1;
    }

    /* using SCN with fscanf and PRI with printf */
    while (fscanf (fp, "%lf %s %" SCNu64 " %" SCNu32 " %" SCNu32 "", 
                &time, op_type, &location, &req_size, &temp) == 5)
        printf ("[Application] OP : %s    Location : %10" PRIu64 "   "
                "  Time : %.0lf    Size : %5" PRIu32 "\n", op_type, 
                location, time, req_size);

    if (fp != stdin) fclose (fp);     /* close file if not stdin */

    return 0;
}
#包括
#包括/*用于uintX\u t*/
#包括/*用于SCNtX和PRItX*/
int main(int argc,字符**argv){
双倍时间;
uint64\u t位置;/*精确大小变量*/
uint32要求的尺寸、温度;
char op_类型[10];
文件*fp=argc>1?fopen(argv[1],“r”):stdin;
如果(!fp){/*验证文件是否打开以进行读取*/
fprintf(stderr,“错误:文件打开失败“%s”。\n”,argv[1]);
返回1;
}
/*将SCN与fscanf一起使用,将PRI与printf一起使用*/
而(fscanf(fp),%lf%s%“SCNu64”%“SCNu32”%“SCNu32”,
&时间、操作类型、位置、需求大小和温度)==5)
printf(“[应用程序]操作:%s位置:%10”PRIu64”
“时间:%.0lf大小:%5”PRIu32“\n”,操作类型,
位置、时间、需求大小);
如果(fp!=stdin)fclose(fp);/*如果不是stdin,则关闭文件*/
返回0;
}
这将消除任何存储大小差异

示例使用/输出

$ ./bin/readloc <dat/location.txt
[Application] OP : Read    Location :  383496192     Time : 128166477394345568    Size : 32768
[Application] OP : Read    Location :    2822144     Time : 128166483087163648    Size : 65536
[Application] OP : Read    Location : 3221266432     Time : 128166620794097840    Size :  4096
[Application] OP : Read    Location :    3354624     Time : 128166624207799328    Size : 49152
[Application] OP : Read    Location :    2961408     Time : 128166624207887072    Size : 57344
[Application] OP : Read    Location :  368979968     Time : 128166624210238736    Size : 65536
[Application] OP : Read    Location :  395730944     Time : 128166624211812800    Size : 65536
[Application] OP : Read    Location :  442093568     Time : 128166624211962704    Size : 65536
[Application] OP : Read    Location :  437964800     Time : 128166624211968352    Size : 65536
[Application] OP : Read    Location :  396734464     Time : 128166624212755744    Size : 49152
[Application] OP : Read    Location :  386232320     Time : 128166624212868368    Size : 20480
[Application] OP : Read    Location :  398438400     Time : 128166624212905984    Size : 45056
[Application] OP : Read    Location :  378523648     Time : 128166624213527424    Size : 65536
[Application] OP : Read    Location :  404738048     Time : 128166624213988224    Size : 65536
[Application] OP : Read    Location :  404475904     Time : 128166624213996448    Size : 65536
[Application] OP : Read    Location :  381739008     Time : 128166624232905616    Size : 65536
[Application] OP : Read    Location :  439144448     Time : 128166624242878896    Size : 57344
[Application] OP : Read    Location :    3608576     Time : 128166624242935248    Size : 57344
[Application] OP : Read    Location :  386646016     Time : 128166624243149616    Size : 65536
[Application] OP : Read    Location :  398176256     Time : 128166624243365008    Size : 65536
[Application] OP : Read    Location :  397676544     Time : 128166624274398032    Size : 32768
[Application] OP : Read    Location :    6320128     Time : 128166624295029088    Size : 65536

$./bin/readloc为什么您的
printf()
%ul”
而不是
%lu”
?可能1)阅读
fscanf
的手册页2)检查其返回值奇怪的是,它们将适合64位的
无符号int
,但您的设置似乎太严格了。你能发布你正在编译和运行的架构吗?还可以发布生成的可执行文件的文件类型吗?请始终检查scanf类函数的返回值。还要检查结尾处的
ferror
的返回值。@alvits-一点也不奇怪。“64位”是内存体系结构的一个特征,而不一定是整数类型大小的驱动程序。有64位实现,有32位<代码>未签名int < />代码(我不知道任何64位实现只支持16位<代码>未签名int < /C> >,但是C和C++标准实际上也不阻止它)。为什么您的代码> Prtff()/Cuth>有<代码> %%UL > />代码>而不是<代码> %LUE?
?可能1)阅读手册页中的
fscanf
2)检查其返回值这很奇怪,它们将适合64位的
无符号int
,但您的限制似乎太大了。你能发布你正在编译和运行的架构吗?还可以发布生成的可执行文件的文件类型吗?请始终检查scanf类函数的返回值。还要检查结尾处的
ferror
的返回值。@alvits-一点也不奇怪。“64位”是内存体系结构的一个特征,而不一定是整数类型大小的驱动程序。有64位实现,有32位<代码>未签名的INT/COD>(我不知道任何64位实现,只支持16位<代码>无符号int < /C> >,但是C和C++标准实际上也不阻止这一点。戴维C,您的代码在我的系统中工作得很好。但是,即使我使用uint64\t,我的代码仍然存在问题。你能帮我解决一下潜在的问题吗?当然,今晚我有几个小时的时间。确保您已经发布了完整的、最新的代码(只需将其添加到t的末尾)
$ ./bin/readloc <dat/location.txt
[Application] OP : Read    Location :  383496192     Time : 128166477394345568    Size : 32768
[Application] OP : Read    Location :    2822144     Time : 128166483087163648    Size : 65536
[Application] OP : Read    Location : 3221266432     Time : 128166620794097840    Size :  4096
[Application] OP : Read    Location :    3354624     Time : 128166624207799328    Size : 49152
[Application] OP : Read    Location :    2961408     Time : 128166624207887072    Size : 57344
[Application] OP : Read    Location :  368979968     Time : 128166624210238736    Size : 65536
[Application] OP : Read    Location :  395730944     Time : 128166624211812800    Size : 65536
[Application] OP : Read    Location :  442093568     Time : 128166624211962704    Size : 65536
[Application] OP : Read    Location :  437964800     Time : 128166624211968352    Size : 65536
[Application] OP : Read    Location :  396734464     Time : 128166624212755744    Size : 49152
[Application] OP : Read    Location :  386232320     Time : 128166624212868368    Size : 20480
[Application] OP : Read    Location :  398438400     Time : 128166624212905984    Size : 45056
[Application] OP : Read    Location :  378523648     Time : 128166624213527424    Size : 65536
[Application] OP : Read    Location :  404738048     Time : 128166624213988224    Size : 65536
[Application] OP : Read    Location :  404475904     Time : 128166624213996448    Size : 65536
[Application] OP : Read    Location :  381739008     Time : 128166624232905616    Size : 65536
[Application] OP : Read    Location :  439144448     Time : 128166624242878896    Size : 57344
[Application] OP : Read    Location :    3608576     Time : 128166624242935248    Size : 57344
[Application] OP : Read    Location :  386646016     Time : 128166624243149616    Size : 65536
[Application] OP : Read    Location :  398176256     Time : 128166624243365008    Size : 65536
[Application] OP : Read    Location :  397676544     Time : 128166624274398032    Size : 32768
[Application] OP : Read    Location :    6320128     Time : 128166624295029088    Size : 65536