用户通过输入文件输入终端

时间:2014-02-09 10:54:20

标签: c input terminal

所以我计算了文件中读取的双值的平均值和标准偏差。

我的文件数据每行有1个数字:我在文件中的数据如下

1
2
3
4
5
6
7
8
9
10

我的代码如下:

#include <stdio.h>
#include <stdlib.h>
#include <math.h>

int main(){

    FILE *inputfile= fopen("file.dat.txt", "r");

    if (inputfile == NULL)
    {
        printf("Failed to open text file.\n");
        exit(1);
    }

    double i; 
    double j=1;
    double average; 
    double stdish=0;
    double stdreal=0; 
    double x=0;
    double sum=0;
    double stdfinal;

    while(fscanf(inputfile, "%lf", &i) != EOF){
        x=x+1;
        sum = sum + i;
        j = i*i;
        stdreal +=j;
    }
        average = sum/x;
        stdish = (stdreal/x)-(average*average);
        stdfinal = sqrt(stdish);

    printf("The average is %.4lf\n", average);
    printf("The standard deviation is %.4lf\n", stdfinal);

 fclose(inputfile);
return 0;
}

我通过终端运行这个。 我的数据文件是file.dat.txt。我想要做的是让用户通过终端输入文本文件,而不是让它在程序中。

像这样:./sdev < file.dat

我不确定如何在我的程序中实现这个...

谢谢!

3 个答案:

答案 0 :(得分:0)

你可以使用./sdev file.dat

传递给程序的参数来实现
int main(int argc, char* argv[]) {

    if (argc != 2 )
    {
        printf("Your help text here\n");
    }

    FILE *inputfile= fopen(argv[1], "r");

    [...]

或者如果你想用echo "file.dat" | ./sdev阅读它,你已经用stdin阅读了它 这可以扩展到读取多个文件。

char filename[1024]
if (fgets(filename, sizeof(filename), stdin)) {

    FILE *inputfile= fopen(filename, "r");

    [...]
}

答案 1 :(得分:0)

用参数写主函数。这样您就可以在调用可执行文件时从终端传递文件名。

请参阅此路径中的示例程序: http://www.astro.umd.edu/~dcr/Courses/ASTR615/intro_C/node11.html

答案 2 :(得分:0)

基本上有两种方法可以做到这一点。第一种方法是通过文件重定向通过stdin接受输入。这是你提出的方法:

$ ./sdev < file.dat

您的程序应该从stdin而不是inputfile阅读。您可以更改所有出现的'inputfile to stdin , but you could also make inputfile a shallow copy to the file handle stdin`:

int main()
{    
    FILE *inputfile = stdin;

    /* do stuff */
    return 0;
}

请注意,您不会关闭stdin。它是由操作系统管理的系统文件句柄。它不是NULL

第二种方法是将文件指定为命令行参数:

$ ./sdev file.dat

然后,您的程序必须使用接受命令行参数的main形式。请注意,程序名称本身作为第一个参数传递,因此您的文件名应该在'argv [1]中:

int main(int argc, char *argv[])
{    
    FILE *inputfile;

    if (argc != 2) {
        fprintf(stderr, "Usage: sdev inputfile\n");
        exit(1);
    }

    inputfile = fopen(argv[1], "r");

    if (inputfile == NULL) {
        fprintf(stderr, "Failed to open %s.\n", inputfile);
        exit(1);
    }

    /* do stuff */

    fclose(inputfile);
    return 0;
}

在此,您必须在程序中明确打开和关闭inputfile