C++ 为什么从fscanf读取不正确的数据?
我试图通过fscanf从文件中读取数据,然后打印数据。 然而,有些数据是不正确的。有四列。只有第三列数据有问题。另一列没有问题 正确读取文件中的小数据,但大数据饱和到26843519。它看起来有数据类型限制。但编号26843519不是特定数据类型的限制编号 我正在尝试更改许多数据类型。我仍然无法解决这个问题 你能帮忙吗 编译和运行系统: I7-4790,ubuntu 14.04.1 x86_64,gcc(g++)4.8.4 资料来源: 输入数据文件: (第三列是个问题。) 输出结果(通过printf): (第三个数据将输出到“位置”。)C++ 为什么从fscanf读取不正确的数据?,c++,c,C++,C,我试图通过fscanf从文件中读取数据,然后打印数据。 然而,有些数据是不正确的。有四列。只有第三列数据有问题。另一列没有问题 正确读取文件中的小数据,但大数据饱和到26843519。它看起来有数据类型限制。但编号26843519不是特定数据类型的限制编号 我正在尝试更改许多数据类型。我仍然无法解决这个问题 你能帮忙吗 编译和运行系统: I7-4790,ubuntu 14.04.1 x86_64,gcc(g++)4.8.4 资料来源: 输入数据文件: (第三列是个问题。) 输出结果(通过prin
你的(更新的)代码对我有用。在任何情况下,整数大小都不是问题,除非您使用的是非常奇怪的体系结构。第一个出错的值是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