C编程:基本的fscanf问题与双打

时间:2013-03-22 04:11:10

标签: c scanf

我在fscanf遇到了一些问题。我是C的新手,但我似乎无法从{。}文件中加载fscanf来加载正确的信息。

int main() {

    //Vars
    FILE *tempFileIn;
    int rowIndex = 0;
    int objectIdNum;
    double magnitudePhotographed;
    double distance;
    int velocity;
    double magnitudeCorrected;
    double magnitudeTotal;

    //Read File Data
    tempFileIn = fopen("hubbleData.txt","r");
    if (tempFileIn == NULL) {
        printf("File read error.");
    }

    printHeaders();
    while(!feof(tempFileIn)) {
        fscanf(tempFileIn, "%lf %lf %lf %lf %lf", &objectIdNum, &distance, &velocity, &magnitudeCorrected, &magnitudeTotal);
        printf( "%2.3f      %2.3f", velocity, distance);
        printf("\n");
        rowIndex++;
    }

    return 0;
}  

速度按预期打印,但距离始终打印为0.0000。如果我切换两者的打印顺序,将正确打印距离,速度将打印为0.0000。我只关心第二和第三列,但必须根据项目指南扫描所有列。

Input format:
1      0.032    +170      1.5      -16.0
2      0.034    +290      0.5       17.2
6822   0.214    -130      9.0       12.7
598    0.263    -70       7.0       15.1
221    0.275    -185      8.8       13.4
224    0.275    -220      5.0       17.2
5457   0.45     +200      9.9       13.3

Actual Output:                
170.000      0.000
290.000      0.000
-130.000      0.000
-70.000      0.000
-185.000      0.000
-220.000      0.000
 200.000      0.000

Expected Output:
170.000      0.032
290.000      0.034
-130.000      0.214
-70.000      0.263
-185.000      0.275
-220.000      0.275
 200.000      0.45

4 个答案:

答案 0 :(得分:2)

velocity被声明为int,但在doublefscanf()来电中使用printf()。您可能也想将其声明为double

答案 1 :(得分:1)

编辑:我在用户发布速度和距离类型之前发布了此评论。我假设速度和距离是不兼容的浮点型,而不是整数。

试试这个:

printf( "%2.3f      %2.3f", (float)velocity, (float)distance);

我的猜测是你将变量传递给printf,它们与浮点数的大小不同,因此打印“velocity”的第二部分而不是距离。 Printf使用堆栈来传递变量,函数没有定义变量的数量和大小,因此任何大小不匹配都会导致这样的问题。

答案 2 :(得分:0)

objectIdNumvelocity声明为double,以便fscanfprintf正常运作。

您将变量velocity声明为int并在fscanfprintf中使用了错误的格式说明符

答案 3 :(得分:0)

您需要进行3次更改

1)将velocity声明为double

2)在fscanf中,objectIdNum应该被理解为%d而不是%lf

在从main(退出程序)返回之前最终使用flose(tempFileIn);

注意:我假设velocitydouble,因为实际上velocityreal个数字,而不是integral值。