我在编写命令行程序时遇到问题,在计算后编写新文件之前,请使用文本文件作为输入参数。我当前的程序如下:
/* 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;
}