在C中使用scanf()错误地写入文件



我在编写命令行程序时遇到问题,在计算后编写新文件之前,请使用文本文件作为输入参数。我当前的程序如下:

  /* midi2hzf.c */
/*  Converts midi information files in the format midiNote - midiVelocity - duration(msecs) 
    into a frequency information file formatted frequency - ampFactor - duration(msecs)     */
#include <stdio.h>
#include <math.h>
#include <stdlib.h>
float Hz, ampFat;
int midi, velo, durMidi, durHz;
float calHz(float Hz, int midi){
    Hz = pow(2, ((midi-69)/12))*440;
    return Hz;
    }
float calAmp(float ampFat, int velo){
    if (velo >= 0 && velo <= 127){
        ampFat = velo/127;
        return ampFat;
    }else{
        return 1;
    }
}
int main(int argc, char *argv[]){
    FILE *midiFile;
    midiFile = fopen("testmidi.txt", "r");
    FILE *hzFile;
    hzFile = fopen("testhz.txt", "w");
    if(midiFile==NULL||hzFile==NULL){
        printf("File errorn");
        return 1;
    }else{
        while(!feof(midiFile)){
            fscanf(midiFile, "%d%d%d", &midi,&velo,&durMidi);
            durMidi = durHz;
            calHz(Hz, midi);
            calAmp(ampFat, velo);
            fprintf(hzFile, "%ft%ft%dn", Hz, ampFat, durHz);
            printf("%ft%ft%dn", Hz, ampFat, durHz);
        }
    }
    fclose(hzFile);
    fclose(midiFile);}

每次运行程序时,输出文件都包含"0.0000.0000 0.0000 0",这显然不是所需的输出。据我所见,我的函数被正确调用,所有的代码都是有意义的,尽管输出总是错误的。

您的代码中有很多错误。

#include <stdio.h>
#include <math.h>
#include <stdlib.h>
// Functions don't need an input for their output value.
float calHz(int midi){
    return pow(2, (midi - 69) / 12) * 440;
}
float calAmp(int velo){
    if (velo >= 0 && velo <= 127){
        return velo / 127.0;  // need to divide by floating point value
                              // so we don't just get integer division
    }else{
        return 1;
    }
}
int main(int argc, char *argv[]){
    // Variables should be declared locally.
    float Hz, ampFat;
    int midi, velo, durMidi, durHz;
    FILE *midiFile = fopen("testmidi.txt", "r");
    FILE *hzFile = fopen("testhz.txt", "w");
    if(midiFile==NULL||hzFile==NULL){
        printf("File errorn");
        return 1;
    }else{
        // You need to test the return value of fscanf to control the loop.
        while(fscanf(midiFile, "%d%d%d", &midi, &velo, &durMidi) == 3){
            durHz = durMidi;        // you had this the other way around
            Hz = calHz(midi);       // need to assign return value to Hz
            ampFat = calAmp(velo);  // ditto for ampFat
            fprintf(hzFile, "%ft%ft%dn", Hz, ampFat, durHz);
            printf("%ft%ft%dn", Hz, ampFat, durHz);
        }
    }
    fclose(hzFile);
    fclose(midiFile);
    return 0;
}

相关内容

最新更新