【问题标题】:Incorrectly writing files using scanf() in C在 C 中使用 scanf() 错误地写入文件
【发布时间】:2014-12-28 17:36:47
【问题描述】:

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

  /* 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 error\n");
        return 1;
    }else{
        while(!feof(midiFile)){
            fscanf(midiFile, "%d%d%d", &midi,&velo,&durMidi);
            durMidi = durHz;
            calHz(Hz, midi);
            calAmp(ampFat, velo);
            fprintf(hzFile, "%f\t%f\t%d\n", Hz, ampFat, durHz);
            printf("%f\t%f\t%d\n", Hz, ampFat, durHz);
        }
    }

    fclose(hzFile);
    fclose(midiFile);}

每次我运行程序,输出文件都包含“0.0000 0.0000 0”,这显然不是想要的输出。据我所知,我的函数被正确调用并且所有代码都有意义,尽管输出始终是错误的。

【问题讨论】:

  • 检查fscanf的返回值。尝试调试您的代码。
  • 我将如何检查它的返回?

标签: c file-io printf scanf


【解决方案1】:

您的代码中有很多错误。

#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 error\n");
        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, "%f\t%f\t%d\n", Hz, ampFat, durHz);
            printf("%f\t%f\t%d\n", Hz, ampFat, durHz);
        }
    }

    fclose(hzFile);
    fclose(midiFile);
    return 0;
}

【讨论】:

  • 谢谢,我的讲师正在讲解所有这些不同的功能,但实际上没有人向我指出一些事情(例如整数除法的问题)来帮助我编写良好的实践。
猜你喜欢
  • 1970-01-01
  • 2022-09-29
  • 1970-01-01
  • 2016-05-29
  • 2015-08-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多