2013-02-28 12 views
9

Ho bisogno di leggere da un file .data o .txt contenente un nuovo numero float su ogni riga in un vettore.Come leggere un file in vettoriale in C++?

Ho cercato in lungo e in largo e applicati numerosi metodi diversi, ma ogni volta che ottenere lo stesso risultato, di un Main.size() di 0 e un errore che dice "Vector Subscript out of Range", così evidentemente il vettore non è solo leggendo nulla nel file.

Nota: il file si trova entrambi nella cartella e anche nel progetto VS.

Comunque, ecco il mio codice:

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

using namespace std; 

int main() { 

    vector<double> Main; 
    int count; 
    string lineData; 
    double tmp; 

    ifstream myfile ("test.data", ios::in); 

    double number; 

    myfile >> count; 
    for(int i = 0; i < count; i++) { 
     myfile >> tmp; 
     Main.push_back(tmp); 
     cout << count; 
    } 

    cout << "Numbers:\n"; 
    cout << Main.size(); 
    for (int i=0; i=((Main.size())-1); i++) { 
     cout << Main[i] << '\n'; 
    } 

    cin.get(); 
    return 0; 
} 

Il risultato che ottiene è sempre semplice:

Numbers: 
0 
+1

Controllare il risultato di tutte le operazioni di I/O. – hmjd

+0

Che aspetto ha il tuo 'test.data'? – us2012

+0

si prega di dare un'occhiata in de/-serialization. di solito dovresti creare una classe vettoriale e una classe di raccolta vettoriale (in grado di gestire il file di input txt). Un buon inizio è la risposta a questo: http://stackoverflow.com/questions/11415850/c-how-serialize-deserialize-objects-without-any-library – Najzero

risposta

25

il ciclo è sbagliato:

for (int i=0; i=((Main.size())-1); i++) { 

Prova questa:

for (int i=0; i < Main.size(); i++) { 

Inoltre, un modo più idiomatico di leggere i numeri in un vettore e scrivere loro di stdout è qualcosa in queste righe:

#include <iostream> 
#include <iterator> 
#include <fstream> 
#include <vector> 
#include <algorithm> // for std::copy 

int main() 
{ 
    std::ifstream is("numbers.txt"); 
    std::istream_iterator<double> start(is), end; 
    std::vector<double> numbers(start, end); 
    std::cout << "Read " << numbers.size() << " numbers" << std::endl; 

    // print the numbers to stdout 
    std::cout << "numbers read in:\n"; 
    std::copy(numbers.begin(), numbers.end(), 
      std::ostream_iterator<double>(std::cout, " ")); 
    std::cout << std::endl; 

} 

anche se si dovrebbe verificare lo stato del ifstream per errori di lettura.

+1

E ci sei. Bug di assegnazione nascosto. Grazie, C! –

+0

ha, non l'ho visto. – Najzero

+0

OK, funziona bene ma ora sembra che il problema sia che non sta trovando il file o sta leggendo il file come vuoto. – Orgmo

5

Giusto per ampliare la risposta di juanchopanza un po '...

for (int i=0; i=((Main.size())-1); i++) { 
    cout << Main[i] << '\n'; 
} 

fa questo:

  1. Creare i e impostarlo su 0.
  2. Impostare i a Main.size() - 1. Poiché Main è vuoto, Main.size() è 0 e i viene impostato su -1.
  3. Main[-1] è un accesso fuori dai limiti. Kaboom.
3

Solo un consiglio. Invece di scrivere

for (int i=0; i=((Main.size())-1); i++) { 
    cout << Main[i] << '\n'; 
} 

come suggerito sopra, scrivere un:

for (vector<double>::iterator it=Main.begin(); it!=Main.end(); it++) { 
    cout << *it << '\n'; 
} 

da usare iteratori. Se si dispone di C++11 supporto, è possibile dichiarare i come auto i=Main.begin() (solo una scorciatoia a portata di mano però)

questo modo si evita la brutta errore uno-posizione-out-of-bound causata da lasciando fuori un -1 involontariamente.

1

1. Nel ciclo si stanno assegnando valore piuttosto che il confronto valore in modo

i = ((Main.size()) - 1) -> i = (- 1) da Main.size()

principale [ i] produrrà "Vector Subscript out of Range" coz i = -1.

2. Si ottiene Main.size() come 0 forse perché non è possibile trovare il file. Dare il percorso del file e controllare l'output. Inoltre sarebbe bene inizializzare le variabili.