2017-02-06 5 views
-1

私が取り組んでいる課題については、ファイルをストリームして2点間の距離を見つけることになっています。 ifileには、1行に6つの整数があります。各ポイントの距離は3ポイントであるので、私は3のサイズの2つのアレイを作ることにしました。しかし、私は配列にデータを得るのが非常に困難です。以下は、ifileの外観のサンプルです。Fstreamで問題が発生し、データを配列に格納する

2  5  2  8  5  2 
9  0  0  1  3  0 
0  8  8  9  6  3 
3  9  1  8  5  2 
1  4 10  0  0  9 
9  8  1  3  6  8 
9 10  7  3  2  5 

ここには、私が取り組んでいるコードのサンプルがあります。

#include <cmath> 
#include <fstream> 
#include <string> 
#include <iostream> 


using std::cout; 
using std::endl; 
using std::sqrt; 
using std::ifstream; 
using std::string; 


namespace roz 
{ 
bool readpoints(ifstream&ifile, int p1[], int p2[], int sz); 
static int 
pointdistance() 
{ 
    const int coords = 3; 
    int p1[coords]; 
    int p2[coords]; 

    ifstream ifile; 
    string path = "C:\\Users\\Joshbox\\Desktop\\points-3d.txt"; 
    ifile.open(path); 
    if (!ifile) { 
     cout << "File not found: " << path << endl; 

     return -1; 
    } 




    while (readpoints(ifile, p1, p2, coords)) { 

    } 



    return 0; 
} 

bool readpoints(ifstream&ifile, int p1[], int p2[], int sz) { 
    string data; 
    while (getline(ifile, data)) { 
     for (int a = 1; a < sz; a++) { 
      ifile >> p1[a]; 
     } 

     cout << p1; 
    } 

    return true; 
} 


static int(*currentAssignment)() = pointdistance; 
int cse() 
{ 
    return currentAssignment(); 
} 

}

+1

わかりました...だから何ですあなたは持っている問題? – cdhowie

+0

@cdhowieよく私のポイントの1つを試してみると、私は奇妙な出力を得る:F8CC0093。私は過去2日間に自分のコードを使って遊んでいましたが、なぜこれが起きているのかわかりません。 – jrooz

+0

'getline(ifile、data))'は文字列に行を得ます。必要なものを持っていますが、 'ifile >> p1 [a];を実行します。 ' - 代わりに' data'を使います。たぶん 'cout <<データ<< '\ n';'ちょうどあなたが読んだことを見て、それを解析する小さな関数を書いてください – doctorlove

答えて

3

あなたのコード内のいくつかの問題があります。

  • readpointsは常にtrueを返します。つまり、メイン関数内のループwhile (readpoints(ifile, p1, p2, coords))は決して終了しません。
  • readpointsの機能は完全に間違っています。
    • dataに1行全体を格納してから使用することはありません。つまり、このコードは実際には半分の行にのみ作用し、最初の行からすべての代替行を破棄します。
    • for (int a = 1; a < sz; a++)は、反復処理のために入力された数字より1回だけ読み込まれ、渡す数字は「3」であるため、2を読み込むことになります。開始インデックスは '0' 、 '1'ではありません。
    • cout << p1は、配列の内容ではなく、配列のアドレスを出力します。あなたは、配列の内容を印刷するには、このコードを期待している場合は、手動で構築物でp1を反復処理する必要があるようなfor(int i = 0; i < sz; i++) cout << p1[i] << ' ';

あなたはこれらものの、異なっやっている可能性がいくつか他のものもあります"ベストプラクティス"であり、 "あなたのコードが失敗している理由"ではありません。

  • using std::*を多用しているため、コードを読みにくくなっています。あなたが長い、厄介な名前空間トークンを持っていない限り、あなたが一般的な間違い(人がusing namespace std;と書いている)を作成していないにもかかわらず、これをしてはいけません。stdは「長くて面倒」にはなりません。
  • int p1[coords];:Cスタイルの配列は使用しないでください。 C++ - 土地では、スタックに割り当てられた配列を表現するのに好ましい構文はstd::array<int, coords> p1;です。これらの配列を関数に渡すときは、bool readpoints(ifstream & ifile, std::array<int, coords> & p1, std::array<int, coords> & p2);のような署名を書いてください。配列は、自分のサイズを照会することができ、手動でサイズを指定する必要はありません、と配列は、イテレータの使用を可能にするので、あなたはこのようなコードを書くことができますので:for(int & val : p1) ifile >> val;for(int & val : p2) ifile >> val;
+0

'std :: array'を使うもう一つの利点は、' std :: begin() 'と' std :: end() 'と' 'の多くの便利な関数を使って、プログラム。 – cdhowie

+0

すべてのヘルプをお寄せいただきありがとうございます。私はまだ混乱している。最後の学期の私の教授は、配列は悪いと言い、それを使わないと言いました。そのため、配列の使用に関する知識や知識はあまりありません。私はコメント/回答を再読していますが、概念的にはクリックしていないだけです。私はfstreamで数え切れないほどの動画を見ていました。私はコーディングが私のためではないと思っています – jrooz

+0

もう一つの推奨は、配列の代わりに 'std :: vector 'を使うことです。 –

関連する問題