2017-07-10 2 views
0

まず、タイトルが意味をなさない場合は、ごめんなさい。私の質問の本質は、私がフレーズするのがとても難しいことです。入力依存プログラムへのファイルパスの提供

私は自分のデータ構造クラスの課題に取り組んでいます。私は古い学校でJavaを学んだだけで、C++の全く新しいものです。プロジェクトは、テキストファイルclimatedata.txtからデータを読み込む気象ロガーです。私の先生はファイルに主な機能を与えてくれました(私たちは何も修正できません)weatherlog.cppこれは以下の通りです。

#include <iostream> 
#include <fstream> 
#include "datalogger.h" 

using namespace std; 
int main(int argc, char** argv) { 

datalogger dl; 

if (argc != 2) { 
    cout << "Usage: " << argv[0] << " <datafile>" << endl; 
    exit(0); 
} 

// Read the data 

char* datafile = argv[1]; 
ifstream infile(datafile); 
int timestamp; 
double temperature; 
double windspeed; 

while (!infile.eof()) { 
    infile >> timestamp; 
    infile >> temperature; 
    infile >> windspeed; 

    if (!infile.eof()) { 
     dl.addData(timestamp, temperature, windspeed); 
    } 
} 

// Output the report 
dl.printReport(); 

return(0); 
} 

は当初、私は私が argcは、main関数のスコープ内にあるものを考え出しまでプログラムを完全に実行することはない理由として混乱していました。彼はコンパイル中にテキストファイル名を指定して、 argcが1の代わりに2(デバッグ時に見た値)になるようにして、すぐに終了するのではなくプログラムの残りの部分を実際に実行できるようにしたいようです。

私の問題は、テキストファイルの場所をプログラムに与える方法がわかりません。私はインターネット全体を見てきましたが、ファイルパスを提供する段階がわからないので、私は成功しませんでした。その情報はg ++でコンパイルするときに渡されるはずですか?実行可能ファイルを実行しようとしているときにコンパイルが正常に完了したら?ターミナルコマンドはどのように見えるのですか?

+2

コマンドラインからプログラムを実行してください: 'myprogram c:\ mypath \ climatedata.txt'。私たちがここにいる間に、なぜループ状態の中にあるiostream :: eofが間違っていると思われますか?(https://stackoverflow.com/questions/5605125/why-is-iostreameof-inside-a-loop-condition-considered-間違っている)リンクをクリックして見つけてください。 – user4581301

+0

学校のSSHサーバーでプログラムを実行しています。 './a.out climatedata.txt'コマンドで実行すると、'セグメンテーションエラー 'が返されます。それは私がファイルを提供し、別の問題をunboxedする方法を知らない私の最初の問題を解決したようだ。 – ThomasJazz

+0

良いスタート。今度はGnu DeBuggerの 'gdb'の下でプログラムを実行してください。非常に便利なプログラム。この場合、プログラムを実行してクラッシュするのを待ってから、 'bt'コマンドを使ってクラッシュしたときに何が起こっていたのかを確認するだけで、多くのことを行う必要はありません。間違いなく、 'gdb'のより高度な使い方に慣れるためには時間を割く価値があります。あなたが今使っている時間は何度も何度も返されます。 – user4581301

答えて

0

私はあなたがargvにファイル名を提供する必要があることを理解しています(私が間違っている場合は以下のコメント)。 argvは、コマンドラインによって渡される引数の配列であり、argcは渡された引数の量(自動的に設定されます)です。 ./<progam> <file_name>

例:

コンパイルをちょうどあなたがハローワールドprogamと同じように、単にこのように、端末にプログラムを呼び出すことができません。

プログラムweatherlog climatedata.txtを呼び出します。

名前にスペースが含まれている場合は、ファイルを削除するか、名前を引用符で囲んでください。

0

argcは、渡されたパラメータの数を格納します。一方、argvは、パラメータを指します。

if (argc != 2)は、コンソールモードで渡された入力パラメータの数を確認することを意味します。最初のパラメータは常にプログラム名です。 2番目のパラメータから、必要なものを渡すことができます。 char* datafile = argv[1];は、第2パラメータをデータファイル名とみなすことを意味します。

つまり、コンソールモード(Windowsの場合はCMD、Linuxの場合はTerminal)を開いて、yourprogram C:\path\to\climatedata.txtのように入力します。

関連する問題