简体   繁体   English

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

[英]Why the incorrect data are read from fscanf?

I trying to read the data by fscanf from file, then I printed the data. 我试图通过fscanf从文件中读取数据,然后打印了数据。 However, some of data are not correct. 但是,某些数据不正确。 There are four column. 有四列。 Only third column data have a problem. 仅第三列数据有问题。 The other column is no problem. 另一列是没有问题的。

Small number is read from file correctly, but large data are saturated to 26843519. It looks data type limitation. 从文件中正确读取了小数字,但大数据已饱和到26843519。它看起来是数据类型的限制。 but the number 26843519 is not the limitation number of specific data type. 但是数字26843519不是特定数据类型的限制数。

I trying to change many data type. 我试图更改许多数据类型。 I still could not solve this issue. 我仍然无法解决此问题。

Could you please help it? 你能帮忙吗?

Compling and running system : I7-4790, ubuntu 14.04.1 x86_64, gcc(g++) 4.8.4 编译并运行系统:I7-4790,Ubuntu 14.04.1 x86_64,gcc(g ++)4.8.4

Source: 资源:

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);

Input data file: 输入数据文件:

(The third column is a problem.) (第三列是一个问题。)

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

Outputted results (by printf): 输出结果(通过printf):

(The third data will be outputted to "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

Your (updated) code works for me. 您的(更新的)代码对我有用。 In any case, it's not a problem with integer size unless you're using a very odd architecture. 无论如何,除非您使用非常奇怪的体系结构,否则整数大小不是问题。 The first value to go wrong is 383,496,192, which can be represented in 28 bits (2^29 = 536,870,912). 第一个出错的值是383,496,192,可以用28位表示(2 ^ 29 = 536,870,912)。

If there is a question about architecture impacting integer size, the you can use the exact size integer representations provided by stdint.h and the scan and print macros in inttypes.h . 如果存在关于体系结构影响整数大小的问题,则可以使用stdint.h提供的确切大小整数表示形式以及inttypes.h的scan和print宏。 For example, your code could be rewritten as: 例如,您的代码可以重写为:

#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;
}

That will eliminate any storage size differences. 这将消除任何存储大小差异。

Example Use/Output 使用/输出示例

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

Look it over, give it a try, and let me know if you have any questions. 查看一下,尝试一下,如果您有任何问题,请告诉我。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM