C语言 用户通过带有输入文件的终端输入

bnl4lu3b  于 2023-03-07  发布在  其他
关注(0)|答案(3)|浏览(140)

所以我计算了从文件中读取的双精度值的平均值和标准差。
我的文件数据每行有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
我不太清楚如何在我的程序中实现这个...
谢谢!

txu3uszq

txu3uszq1#

写一个带参数的主函数。2这样你就可以在调用可执行文件时从终端传递文件名。
请参见以下路径中的示例程序:http://www.astro.umd.edu/~dcr/Courses/ASTR615/intro_C/node11.html

svujldwt

svujldwt2#

基本上有两种方法,第一种方法是通过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

zpf6vheq

zpf6vheq3#

你可以用./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");

    [...]
}

相关问题