2014-02-09 3 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'. –

ответ

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 вы читали его с стандартным вводом это вы могли бы затем расширить для чтения в нескольких файлах ,

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 входной_файл стандартного ввода 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 явно в вашей программе.

Смежные вопросы