2017-02-15 11 views
1

の一部の専門家が私を助けてくれることを期待してください。 Stackに投稿したのは初めてのことなので、私のことを辛抱してください。ありがとう。 ARGVからテキストファイルを開こうとしましたコマンドライン引数から乱数のtextfile.txtを読んで、

  1. は、[1]が、プログラムが
  2. NULLは、一度に1つの文字を読み込むfgetc関数を使用しようとした示した: はここに私の問題のリストです。 "white_space"を押すと、バフに( '2.2')を入れ、 '\ 0'を追加してから、sscanfを使ってダブルタイプにします。このアプローチが正しいかどうかはわかりません。ここで

私のコードです:

/* 
* This program computes simple statistics from a file of ASCII numbers 
*/ 

/* 
* File: statsMain.c 
* Author: William Vu T Nguyen 
* ID: C0436847 
* Created on February 6, 2017, 12:10 PM 
*/ 

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

void printStats(FILE *dest, const int count, const double mean, 
     const double ssdev); 

// main program 

int main(int argc, char** argv) { 
    FILE *pFile; 
    int count; 
    int x; 
    char buff[100] = {0}; 
    char *pBuff = buff; 
    double numVal; 
    double sum; 
    double sumsq; 
    double calculatedMean; 
    double calculatedStdDev; 

    if (argc != 2) { 
     fprintf(stderr, "usage: %s dataFileName\n", argv[0]); 
     exit(EXIT_FAILURE); 
    } else { 
     if ((pFile = fopen(argv[1], "r")) == NULL) { 
      fprintf(stderr, "Unable to open input file \"%s\"\n", argv[1]); 
      exit(EXIT_FAILURE); 
     } else { 
      while ((x = fgetc(pFile)) != EOF) { 
       *pBuff = x; 
       sscanf(pBuff, "%lf", &numVal); 
       sum += numVal; 
       sumsq += (sum * sum); 
       count++; 
       pBuff++;     
      }   

      calculatedMean = mean(sum, count); 
      calculatedStdDev = ssdev(sum, sumsq, count); 
      printStats(pFile, count, calculatedMean, calculatedStdDev); 
     } 
     fclose(pFile); 
    } 

    return (EXIT_SUCCESS); 
} 

void printStats(FILE *dest, const int count, const double mean, 
     const double ssdev) { 
    char str[100] = {0}; 

    sprintf(str, "%d Values, Mean = %lf, Sample Standard Deviation = %lf" 
      , count, mean, ssdev); //deal with buffer 
    puts(str); 
    fprintf(dest, "%s", str); 
} 

私のコードは、私はCで初心者だことを示していた場合、私は私の学習段階ではまだだとして、その後しばらくお待ちください。私はプログラミング、回路設計、マイクロコントローラが大好きです。それらの科目を勉強するときに学校でひどくやったけど、決してそれが私の人生の決定的要因になることはありません。ありがとう。

+2

1)1つではなく、2つの質問があるはずです:1つ目は、第二が行う」ある「なぜ 'のfopen()'を返す 'NULL'は?」私はファイルのデータを正しく扱いますか? "最初の方には明らかな答えがあります: 'fopen()'はエラーの際に 'NULL'を返すように定義されていて、' errno'の値をチェックするはずです。あなたは 'perror()'と 'strerror()'について知りたいかもしれません。 POSIXシステムでは、 'errno(3)'マニュアルページを読んでください。 2番目の回答に答えるには、ファイル形式の知識が必要です。そのため、質問の中に抜粋を含める必要があります。 – kostix

+0

まったく、「YYYを解決するには、XXXは正しい方法ですか? StackOverflowフォーマットには適していません - 非公式のディスカッション/コードレビューのためにhttps://programmers.stackexchange.comを試してください。 – kostix

+0

したがって私はSOのガイドラインに合うように編集することは不可能だと思うので、現在の形で質問を閉じることに投票します。私が示唆したように、代わりに2つの別々の質問をすることを検討してください。 – kostix

答えて

2

あなたがまたしている:

  • が読み取り専用として開かれたpFileを渡し、そしておそらく間違いを犯し
  • それらを初期化せずにsumsumsq、およびcountを使用して、それに
  • を書き込もうとしsumsq += (sum * sum);

固有のstdinstdoutファイルポインタ、その後、あなたは次のようなものを行うことができます。

statsはあなたのプログラムである
stats <input_file> output_file 

。 Linuxを使用している場合は、プログラムをteeにチェーンして、コンソールやファイルに出力しようとしているものとまったく同じように実行できますが、余分なコードは必要ありません。私はそれを書くだろうか

#include <stdlib.h> 
#include <stdio.h> 
#include "statistics.h" 

void printStats(const int count, const double mean, const double ssdev); 

int main() { 
    int count = 0; 
    double numVal, sum = 0.0, sumsq = 0.0; 
    double calculatedMean, calculatedStdDev; 

    while (scanf("%lf", &numVal)) { 
     sum += numVal; 
     sumsq += numVal * numVal; 
     count++; 
    } 

    calculatedMean = mean(sum, count); 
    calculatedStdDev = ssdev(sum, sumsq, count); 
    printStats(count, calculatedMean, calculatedStdDev); 

    return EXIT_SUCCESS; 
} 

void printStats(const int count, const double mean, const double ssdev) { 
    printf("%d Values, Mean = %lf, Sample Standard Deviation = %lf\n", 
     count, mean, ssdev); 
} 
+0

ポイントを獲得しました。あなたのご意見ありがとうございます。私は、私の研究室の一部としてコマンドライン引数を使用して、読み取り専用ファイルを開こうとしました。コードを書き直しましたが、別の問題が発生しました。しかし、それは別の時間です。ありがとう。 – Will

関連する問題