c++ - 为什么从 fscanf 读取了不正确的数据?

标签 c++ c

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

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

我试图改变许多数据类型。我仍然无法解决这个问题。

你能帮忙吗?

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

来源:

while(!feof(trace_file))
{
double time;
unsigned long location;
unsigned int req_size, temp; 
char op_type[10];

//fscanf(trace_file, "%s\t%lf\t%d\n", op_type, &time, &location);
fscanf(trace_file, "%lf %s %lu %d %d \n", &time, op_type, &location, &req_size, &temp);

// for debug
printf("[Application] OP : %s     Location : %lu     Time : %lf    Size : %d\n", op_type, location, time, req_size);

输入数据文件:

(第三列有问题。)

128166477394345573     Read     383496192     32768     113736
128166483087163644     Read     2822144     65536     71730 
128166620794097839     Read     3221266432     4096     121008
128166624207799335     Read     3354624     49152     147664
128166624207887065     Read     2961408     57344     59933
128166624210238731     Read     368979968     65536     52003
128166624211812801     Read     395730944     65536     40423
128166624211962708     Read     442093568     65536     46765
128166624211968354     Read     437964800     65536     41118
128166624212755738     Read     396734464     49152     34979
128166624212868365     Read     386232320     20480     78602
128166624212905977     Read     398438400     45056     40989
128166624213527427     Read     378523648     65536     44536
128166624213988219     Read     404738048     65536     52490
128166624213996455     Read     404475904     65536     44254
128166624232905615     Read     381739008     65536     41223
128166624242878893     Read     439144448     57344     67882
128166624242935246     Read     3608576     57344     11528
128166624243149609     Read     386646016     65536     109663
128166624243365012     Read     398176256     65536     50510
128166624274398038     Read     397676544     32768     111035
128166624295029088     Read     6320128     65536     104853

输出结果(通过printf):

(第三个数据会输出到“Location”。)

[Application] OP : Read     Location : 26843519     Time : 128166477394345568.000000    Size : 32768
[Application] OP : Read     Location : 2822144     Time : 128166483087163648.000000    Size : 65536
[Application] OP : Read     Location : 26843519     Time : 128166620794097840.000000    Size : 4096
[Application] OP : Read     Location : 3354624     Time : 128166624207799328.000000    Size : 49152
[Application] OP : Read     Location : 2961408     Time : 128166624207887072.000000    Size : 57344
[Application] OP : Read     Location : 26843519     Time : 128166624210238736.000000    Size : 65536
[Application] OP : Read     Location : 26843519     Time : 128166624211812800.000000    Size : 65536
[Application] OP : Read     Location : 26843519     Time : 128166624211962704.000000    Size : 65536
[Application] OP : Read     Location : 26843519     Time : 128166624211968352.000000    Size : 65536
[Application] OP : Read     Location : 26843519     Time : 128166624212755744.000000    Size : 49152
[Application] OP : Read     Location : 26843519     Time : 128166624212868368.000000    Size : 20480
[Application] OP : Read     Location : 26843519     Time : 128166624212905984.000000    Size : 45056
[Application] OP : Read     Location : 26843519     Time : 128166624213527424.000000    Size : 65536
[Application] OP : Read     Location : 26843519     Time : 128166624213988224.000000    Size : 65536
[Application] OP : Read     Location : 26843519     Time : 128166624213996448.000000    Size : 65536
[Application] OP : Read     Location : 26843519     Time : 128166624232905616.000000    Size : 65536
[Application] OP : Read     Location : 26843519     Time : 128166624242878896.000000    Size : 57344
[Application] OP : Read     Location : 3608576     Time : 128166624242935248.000000    Size : 57344
[Application] OP : Read     Location : 26843519     Time : 128166624243149616.000000    Size : 65536
[Application] OP : Read     Location : 26843519     Time : 128166624243365008.000000    Size : 65536
[Application] OP : Read     Location : 26843519     Time : 128166624274398032.000000    Size : 32768
[Application] OP : Read     Location : 6320128     Time : 128166624295029088.000000    Size : 65536
[Application] OP : Read     Location : 26843519     Time : 128166624295087648.000000    Size : 49152

最佳答案

如果对架构影响整数大小有疑问,您可以使用 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;
}

这将消除任何存储大小差异。

示例使用/输出

$ ./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

仔细查看,试一试,如果您有任何问题,请告诉我。

关于c++ - 为什么从 fscanf 读取了不正确的数据?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38536509/

相关文章:

c++ - 如果左值不再用于其定义范围,编译器是否允许将左值转换为右值引用?

c++ - C++类中的公共(public)结构

c - 混合编程发布失败但调试成功

可以使用 stdin 和 stdout 作为 tcp 套接字执行 bash

C编程,如何在等待用户输入时运行for循环

c++ - 服务器应用程序必须向 N 个客户端发出 ping 命令。有没有办法让它多线程?

c++ - 如何在使用 2D 数组 C++ 时将排序对转换为 3x3 矩阵

c++ - Boost.Python 是否需要其他 boost 库的绑定(bind)代码?

c++ - C/C++ : goto into the for loop

python - 为什么以下代码在 C 和 Python 中给出不同的输出?