我对'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 []){
我不知道从哪里开始 . 任何帮助,将不胜感激 . 整个代码可在以下位置获得:
2 回答
Q1:将实际输入文件路径作为命令行参数传递
Q2:谁能知道?但该代码似乎是这样假设的 .
Q3:将主要功能定义为
摆脱那个错误 .
通常你可以在每个问题上提出一个问题,并且有很好的理由 . 感到很幸运,您的问题在这里得到了解答 . 不要怀疑你的问题是否可能被低估并删除 .
Q2:根据
fscanf
格式字符串,您的数据将以6个值(5个整数和1个浮点)的批量从文件中读取,用空格分隔 . 绝对不要求在列中组织这些值或以任何其他方式格式化"nicely" . 该文件将被fscanf
视为由空格分隔的值的线性流(磁带) . 空格包括空格,制表符,换行符 . 即fscanf
并不关心如何将值流分割为物理文件行 . 您可以将输入文件格式化为一个巨大的单行值,或者您可以以任何方式将其切割成行 .顺便说一句,该格式字符串末尾的
\n
是多余的,根本没有任何结果 ."%d%d%d%d%d%lf"
也会一样 .也
是一个相当危险的成功条件 . 如果从文件中读取至少一个但少于六个值,则会将其视为成功读取 . 但是,未读变量将仅保留其原始值,从而产生通常无意义的组合 . 这个
作为成功条件会更有意义 .
问题3:正如编译器已经告诉过你的那样,
main
必须声明为返回int
.void main
是非法的 .附:另一个小挑剔:
printf
中的%lf
格式在C99中变得合法 . 因此,从迂腐的角度来看,这段代码需要一个C99(或更高版本)的编译器,即使它似乎是在所有其他方面为"old" C编译器编写的 .