0

嗨,我有一个 ac 程序,它根据 14 个不同的参数计算分数(每人):

$ ./ScorecommandLine 30 0 0 0 0 0 35 1 1 1 130 1 1 1
0.057748

但是目前我一次只能计算一个分数。我想做的是为很多不同的人多次加载参数,而不是这样做:

$ ./ScorecommandLine 150 0 0 0 0 0 35 1 1 1 130 1 1 1
    0.0577487
$ ./ScorecommandLine 30 1 0 10 4 0 31 1 15 1 90 1 4 1
    0.0897333
$ ./ScorecommandLine 50 0 0 9 0 0 25 1 3 1 123 1 0 0
    0.4567748
$ ./ScorecommandLine 30 0 1 0 0 8 35 1 1 1 130 1 1 1
    0.0838395
$ ./ScorecommandLine 30 1 1 0 1 0 65 4 4 1 32 1 3 1
    0.0495855

我必须运行命令 5 次并且每次都必须为每个人输入新数据,我宁愿将数据保存在 csv 文件中并将其加载到命令行中,以便我的程序一次性返回所有分数。

4

5 回答 5

4

我建议用 打开文件,用fopen()读取每一行fgets(),然后用 解析出数字sscanf()

于 2013-02-07T21:45:45.043 回答
2

你已经有了正确的想法!你的程序是完美的,它只需要被调用 N 次就可以完成一项工作,而且这一切都可以定义,就像你在 .csv 文件中所说的那样。

现在您所需要的只是一个读取 .csv 文件并调用您的程序 N 次来完成工作的程序。一个很好的方法是使用单独的 c 程序并使用popen. 更好的是,因为这是一项小工作,所以编写一个 shell 脚本来为你做这件事。

使用类似的东西popen非常简单,也很令人兴奋;尝试The Art of Linux Programming以了解如何开始。

如果您没有时间学习popen,那么您可以随时编辑您的原始程序。例如,只需检查第一个参数是否为“-csv”,如果是,则调用加载 csv 文件的单独函数,并根据需要进入 while 循环。

于 2013-02-07T21:52:08.310 回答
2

让您的程序从stdinusing读取整行fgets,例如在 while 循环内。然后使用sscanf将整行解析为您的代码需要的变量。仍在 while 循环内,运行生成分数的位。

编译程序后 - 假装它是 myprog:

myprog < myfile.csv
于 2013-02-07T21:49:01.377 回答
1

一个更简单的方法是做这样的事情:

#include <stdio.h>

void doYourCalculation(int *iArray) { 
   /*do whatever you do*/
}

int main(int argc, char *argv[])
{
  int iArray[14];
  int i = 0;
  while(1){
    if(scanf("%d",&iArray[i]) != 1){
      break;
    }
    i++;
    if(i == 14) {
      i = 0;
      doYourCalculation(iArray);
    }
  }
  return 0;
}

由于您使用的是 unix/linux,因此请利用 shell:

在终端中发出此命令:

$ cat your_data_file.dat | ScorecommandLine

your_data_file.dat 看起来像:

150 0 0 0 0 0 35 1 1 1 130 1 1 1
130 0 0 0 0 0 25 1 1 1 150 2 4 3
50 0 0 9 0 0 25 1 3 1 123 1 0 0
-

最后-的 标记输入结束。

编程的哲学是使其尽可能简单和准确。

于 2013-02-07T21:57:36.520 回答
1

我建议您编写简单的 shell 脚本来读取文件并在 while 循环中将参数传递给您的程序。这里例如描述了如何在 bash 中读取 csv 文件。也检查一下

于 2013-02-07T21:46:26.557 回答