2014-02-09 91 views
0

所以我計算了文件中讀取的雙值的平均值和標準偏差。通過終端輸入文件的用戶輸入

我的文件數據具有每行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

我不完全知道如何在我的計劃實現這個...

謝謝!

+1

您從'stdin'而不是'inputfile'中讀取。 – 2014-02-09 10:58:26

回答

0

您可以用參數傳遞給程序與​​

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您與標準輸入 閱讀讀它,這可能你再擴展在多個文件中讀取。

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

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

    [...] 
} 
0

基本上有兩種方法可以做到這一點。第一種方法是通過文件重定向接受通過stdin的輸入。這是您提出的方法:

$ ./sdev < file.dat 

你的程序然後應該從stdin而不是inputfile閱讀。您可以更改'inputfile to標準輸入, 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明確。