2016-11-26 4 views
0

ich eine Datei zu lesen und Vektoren, die von ihm zu schaffen, und nach, dass ich versuche eine subvector zu extrahieren wie folgt:C++ Fehler beim subvector Extrahieren nach Lesen der Datei

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

In diesem Fall der Code funktioniert und im nur das erste Merkmal aus dem ursprünglichen Vektor zu entfernen, konnte ich auch so etwas wie:

v.erase(v.begin()); 

die auch geben Sie mir die gewünschte Ausgabe, aber für meine Anwendung ist interessant, die erste Möglichkeit.

Das Problem hier ist, dass ich aus einer Datei lesen und die Vektoren erstellen. Eine solche Datei sieht wie folgt aus:

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 

Wo der erste ist für mich nicht interessant koordinieren, hier ist mein Code:

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; 
} 

Der obige Code kompiliert, aber wenn ich versuche, es zu laufen, gibt mir die seltsame Fehler, die durch den Zeilenvektor v1 (& v [1], & v [Bildhöhe()]) verursacht wird:

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

jemand tut, warum dies geschieht? Ich weiß, dass das Lesen aus der Datei und das Erstellen des Vektors v funktioniert, weil ich bereits versucht habe, den Vektor auf dem Bildschirm anzuzeigen, und es funktioniert gut. Vielen Dank im Voraus für die Hilfe!

+0

Haben Sie versucht, den Code einzustufen? –

+0

Yup, ich habe versucht zu debuggen und zu entfernen und zu analysieren Zeile für Zeile, aber aus irgendeinem seltsamen Grund bekomme ich diesen fatalen Absturz beim Versuch, den Code auszuführen, gebe ich keine Kompilierung Fehler, weil der Code tatsächlich erfolgreich kompiliert wurde: S –

Antwort

1
getline(file, line); 

Wenn dieser Code die letzte Zeile der Datei liest, wird das letzte Zeichen in der Datei, die endgültige Newline lesen. Der Code wird von diesem Punkt fortgesetzt, aber die file hat nichteof setzen. Das Bit eof wird erst gesetzt, nachdem ein Leseversuch aus der Datei aufgrund des Dateiendes fehlgeschlagen ist.

Dies ist noch nicht geschehen. getline() lesen Sie nur so weit wie das letzte Zeichen in der Datei, der letzte Zeilenumbruch, und gestoppt.

Auf der nächsten Iteration der Schleife:

while (file.good()) { 

Dies wird gelingen. Wie ich bereits erklärt habe, ist das Flag eof noch nicht gesetzt.

string line; 
    getline(file, line); 

Dies wird nun nicht alles aus der Datei zu lesen, auf die Datei, um die eof Bits. line wird eine leere Zeichenfolge sein.

line Weil nun leer ist, wird die innere Schleife while wird nichts extrahieren, und

vector<double> v; 

wird ein leerer Vektor bleiben.

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

Da v jetzt ein leerer Vektor ist, wird v.size() 0 sein, so was denken Sie hier, jetzt passieren wird?

+0

Vielen Dank für diesen Hinweis! Ich war so konzentriert, dass das Problem war, als ich versuchte, den Subvektor zu erstellen, dass ich dieses Dataproblem nicht erkannt hatte, vielen Dank dafür, ich habe gerade den Code repariert, bevor ich versuchte, den Subvektor zu extrahieren! –

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; 
}