2016-11-26 13 views
0

を読んだ後サブベクトルを抽出するとき、私はファイルを読み込み、そこからベクトルを作成し、その後、私は次のようにサブベクトルを抽出しようとしている:この場合C++エラーファイル

vector<double> v = {1, 2, 3, 4, 5}; 
displayVector(v); 
vector<double> v2(&v[1], &v[v.size()]); 
displayVector(v2); 

コード作品また、私に所望の出力を与えるが、自分のアプリケーションのための最初の道を面白いです

v.erase(v.begin()); 

:イムはちょうど元のベクトルからの第一の特徴を取り除く、私はまた、のような何かを行うことができます。

ここでの問題は、ファイルから読み込んでベクターを構築することです。このように、このようなファイルを見て:第1の座標

1000025,5,1,1,1,2,1,3,1,1,2 
1002945,5,4,4,5,7,10,3,2,1,2 
1015425,3,1,1,1,2,2,3,1,1,2 
1016277,6,8,8,1,3,4,3,7,1,2 
1017023,4,1,1,3,2,1,3,1,1,2 
1017122,8,10,10,8,7,10,9,7,1,4 
1018099,1,1,1,1,2,10,3,1,1,2 
1018561,2,1,2,1,2,1,3,1,1,2 
1033078,2,1,1,1,2,1,1,1,5,2 
1033078,4,2,1,1,2,1,2,1,1,2 
1035283,1,1,1,1,1,1,3,1,1,2 
1036172,2,1,1,1,2,1,2,1,1,2 
1041801,5,3,3,3,2,3,4,4,1,4 
1043999,1,1,1,1,2,3,3,1,1,2 
1044572,8,7,5,10,7,9,5,5,4,4 
1047630,7,4,6,4,6,1,4,3,1,4 
1048672,4,1,1,1,2,1,2,1,1,2 
1049815,4,1,1,1,2,1,3,1,1,2 
1050670,10,7,7,6,4,10,4,1,2,4 
1050718,6,1,1,1,2,1,3,1,1,2 
1054590,7,3,2,10,5,10,5,4,4,4 
1054593,10,5,5,3,6,7,7,10,1,4 
1056784,3,1,1,1,2,1,2,1,1,2 

は、ここでは、私にとって興味深いものではありません、私のコードは次のとおりです。コンパイル上記のコードは

void displayVector (std::vector<double> &v) { 
    for (auto &feature : v) { 
     std::cout << feature << " "; 
    } 
    std::cout << std::endl; 
} 

void displayTrainingSet(vector<FeaturedVector> &data) { 
    for (auto a : data) { 
     displayVector(a); 
    } 
} 

int main(int argc, char const *argv[]) { 

    ifstream file; 
    string filename = "breast-cancer.data"; 

    file.open(filename, std::ifstream::in); 

    vector<FeaturedVector> data; 

    while (file.good()) { 
     string line; 
     getline(file, line); 
     istringstream buffer(line); 

     double feature; 
     vector<double> v; 

     while (buffer >> feature) { 
      if (buffer.peek() == ',') { 
       buffer.ignore(); 
      } 
      v.push_back(feature); 
     } 

     vector<double> v1(&v[1], &v[v.size()]); 
     data.push_back(v1); 
    } 

    file.close(); 

    //displayTrainingSet(data); 
    return 0; 
} 

が、私は実行しようとすると、それは私に与えますラインベクトルv1によって引き起こされる奇妙なエラー、(& V [1]、& V [v.size()]):この出来事はなぜ

libc++abi.dylib: terminating with uncaught exception of type std::length_error: vector 
Abort trap: 6 

誰かが知っていますか?私は、ファイルから読み込み、ベクトルvを作成することは知っています。すでにベクトルを画面に表示しようとしていて、うまくいきます。助けを前にありがとう!

+0

コードをシングルステップ実行しようとしましたか? –

+0

うん、私はデバッグし、行ごとに分析しようとしましたが、コードを実行しようとすると私はこの致命的なクラッシュを取得するいくつかの奇妙な理由で、実際にはコードが正常にコンパイルされているため、 –

答えて

1
getline(file, line); 

このコードがファイルの最後の行を読み取ると、ファイルの最後の文字、最終改行が読み取られます。コードはこの時点から続きますが、fileではなく、にはeofがあります。 eofビットは、ファイルの終わりのためにファイルからの読み取りが失敗した場合にのみ設定されます。

これはまだ発生していません。 getline()は、ファイル内の最後の文字、最後の改行文字だけを読み込み、停止しました。ループの次の繰り返しに

は:

while (file.good()) { 

これが成功します。私が説明したように、eofフラグはまだ設定されていません。

string line; 
    getline(file, line); 

これは現在のファイルにeofビットを設定、ファイルから何かを読み取るために失敗します。 lineは空の文字列になります。

lineが空になっているので、インナーwhileループは何を抽出していないだろう、と

vector<double> v; 

は、空のベクターのままになります。

vector<double> v1(&v[1], &v[v.size()]); 

vは今、空のベクターであることを考えると、 v.size()は0になりますので、あなたが今、ここに起こるために起こっていると思いますか?

+0

このヒントは大変ありがとう!私はこの問題を、私がこのファイルの問題を認識しなかったサブベクトルを作成しようとしていたときに集中していました。ありがとう、私はサブベクトルを抽出しようとする前に検証を行うコードを修正しました! –

0
I modified your code a little bit to compile on my machine. i can display the data on your sample file. 

#include <vector> 
#include <iostream> 
#include <string> 
#include <fstream> 
#include <sstream> 

using namespace std; 

void displayVector (std::vector<double> &v) { 
    for (auto &feature : v) { 
     std::cout << feature << " "; 
    } 
    std::cout << std::endl; 
} 

void displayTrainingSet(std::vector< std::vector<double> > &data) { 
    for (auto a : data) { 
     displayVector(a); 
    } 
} 

int main(int argc, char const *argv[]) { 

    ifstream file; 
    string filename = "C:/temp/2.txt"; 

    file.open(filename, std::ifstream::in); 

    vector< vector<double> > data; 

    while (file.good()) { 
     string line; 
     getline(file, line); 
     istringstream buffer(line); 

     double feature; 
     vector<double> v; 

     while (buffer >> feature) { 
      if (buffer.peek() == ',') { 
       buffer.ignore(); 
      } 
      v.push_back(feature); 
     } 

     vector<double> v1(&v[1], &v[v.size()]); 
     data.push_back(v1); 
    } 

    file.close(); 

    displayTrainingSet(data); 
    return 0; 
} 
関連する問題