0

我有以下程序称为Scorecommandline

int main (int argc, char *argv[]) {
    if (argc!=15) {
        usage();
        exit(1);
    }

    int iArray[14];
    int i = 0;
    while(1){
        if(scanf("%d",&iArray[i]) != 1){
        break;
        }
        i++;
        if(i == 14) {
        i = 0;
        }
    }

    int age = atoi(iArray[1]);
    int b_AF = atoi(iArray[2]);
    int b_ra = atoi(iArray[3]);
    int b_renal = atoi(iArray[4]);
    int b_treatedhyp = atoi(iArray[5]);
    int b_type2 = atoi(iArray[6]);
    double bmi = atof(iArray[7]);
    int ethrisk = atoi(iArray[8]);
    int fh_cvd = atoi(iArray[9]);
    double rati = atof(iArray[10]);
    double sbp = atof(iArray[11]);
    int smoke_cat = atoi(iArray[12]);
    int surv = atoi(iArray[13]);
    double town = atof(iArray[14]);

    double score = cvd_femal(age,b_AF,b_ra,b_renal,b_treatedhyp,b_type2,bmi,ethrisk,fh_cvd,rati,sbp,smoke_cat,surv,town,&error,errorBuf,sizeof(errorBuf));
    if (error) {
        printf("%s", errorBuf);
        exit(1);
    }
    printf("%f\n", score);
}

我在其中有一个 .dat 文件,打算用于该程序中的 args,但是如果我键入:

cat testscandata.dat | ./ScorecommandLine

该程序不会将文件作为程序的参数读入。我该如何解决这个问题?

谢谢

4

2 回答 2

4

您混淆了将输入传递到程序的两种不同方式。您可以通过main从命令行调用命令并列出参数来将参数传递给程序。例如:

./ScoreCommandLine 1 2 3 4 5 6 7 8 9 10 11 12 13 14

这些参数将被传递到mainthrough argv

stdin您还可以通过使用管道和重定向将数据发送到程序中:

SomeCommand | ./ScoreCommandLine

这将获取 的输出SomeCommand并将其stdin用作ScoreCommandLine. 您可以使用scanf等来阅读它。

在您的情况下,您应该重写程序,以便您不希望通过命令行传递所有参数,或者您应该使用该xargs实用程序转换stdin为命令行参数:

xargs ./ScoreCommandLine < testscandata.dat

希望这可以帮助!

于 2013-02-07T23:53:38.793 回答
1

这不会作为参数传递给程序,但会通过管道传递到stdin程序中./ScorecommandLine- 您将能够通过scanf类似的函数读取它,但不能作为命令行参数。

您需要创建将读取文件(或stdin)的新脚本,它将执行另一个程序,将其作为可执行参数传递。

检查您的程序后,我可以建议删除if (argc!=15),因为您正在阅读stdinscanf而不是在任何地方解析命令行参数。

于 2013-02-07T23:51:35.020 回答