首页 文章

环境物理代码的简单'C'问题

提问于
浏览
-1

我对'c'很新,我正在尝试使用一些代码 . 代码接收输入文件:

年月日期小时分PAR

然后它会在我相信的屏幕上打印出计算结果 .

Q1:我在哪里编辑代码(即用我输入文件的实际名称替换filename?

FILE *in_file;

while((c=getopt(argc, argv, "f:"))!=-1)
 switch(c) {
 case 'f':
    strcpy(filename, optarg);
    break;
 }

in_file=fopen(filename,"r");

while (fscanf(in_file, "%d%d%d%d%d%lf\n", &year, &month, &date, &hour, &minute, &par )>0){

Q2:我是否正确地假设输入文件是一个ascii文件,其中6列用单个空格分隔?

Q3:我尝试使用g w / redhat编译代码后再玩一下但是总是得到这个错误:

28:33:错误:':: main'必须返回'int'void main(int argc,char * argv []){

我不知道从哪里开始 . 任何帮助,将不胜感激 . 整个代码可在以下位置获得:

DiffuseRadiation.c

2 回答

  • 5

    Q1:将实际输入文件路径作为命令行参数传递

    Q2:谁能知道?但该代码似乎是这样假设的 .

    Q3:将主要功能定义为

    int main(int argc, char* argv[]) {
    // ^^^
         // ...
       }
    

    摆脱那个错误 .


    通常你可以在每个问题上提出一个问题,并且有很好的理由 . 感到很幸运,您的问题在这里得到了解答 . 不要怀疑你的问题是否可能被低估并删除 .

  • 0

    Q2:根据 fscanf 格式字符串,您的数据将以6个值(5个整数和1个浮点)的批量从文件中读取,用空格分隔 . 绝对不要求在列中组织这些值或以任何其他方式格式化"nicely" . 该文件将被 fscanf 视为由空格分隔的值的线性流(磁带) . 空格包括空格,制表符,换行符 . 即 fscanf 并不关心如何将值流分割为物理文件行 . 您可以将输入文件格式化为一个巨大的单行值,或者您可以以任何方式将其切割成行 .

    顺便说一句,该格式字符串末尾的 \n 是多余的,根本没有任何结果 . "%d%d%d%d%d%lf" 也会一样 .

    fscanf(in_file, "%d%d%d%d%d%lf\n", &year, &month, &date, &hour, &minute, &par ) > 0
    

    是一个相当危险的成功条件 . 如果从文件中读取至少一个但少于六个值,则会将其视为成功读取 . 但是,未读变量将仅保留其原始值,从而产生通常无意义的组合 . 这个

    fscanf(in_file, "%d%d%d%d%d%lf\n", &year, &month, &date, &hour, &minute, &par ) == 6
    

    作为成功条件会更有意义 .

    问题3:正如编译器已经告诉过你的那样, main 必须声明为返回 int . void main 是非法的 .

    附:另一个小挑剔: printf 中的 %lf 格式在C99中变得合法 . 因此,从迂腐的角度来看,这段代码需要一个C99(或更高版本)的编译器,即使它似乎是在所有其他方面为"old" C编译器编写的 .

相关问题