it-swarm.com.de

Wie kann ich eine Datei in C++ in einen Vektor einlesen?

Ich muss aus einer .data- oder .txt-Datei lesen, die eine neue float-Nummer in jeder Zeile in einen Vektor enthält. 

Ich habe weit und breit gesucht und zahlreiche verschiedene Methoden angewandt, aber jedes Mal bekomme ich dasselbe Ergebnis, nämlich eine Main.size() von 0 und einen Fehler, der "Vector Subscript out of Range" sagt, so dass der Vektor offensichtlich nichts in die Datei liest.

Hinweis: Die Datei befindet sich sowohl im Ordner als auch im VS-Projekt.

Wie auch immer, hier ist mein Code:

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

Das Ergebnis ist immer einfach:

Numbers:
0
13
Orgmo

Deine Schleife ist falsch:

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

Versuche dies:

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

Eine idiotischere Art, Zahlen in einen Vektor zu lesen und sie in stdout zu schreiben, ist etwas in dieser Richtung:

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

}

sie sollten jedoch den Status der ifstream auf Lesefehler überprüfen.

29
juanchopanza

Um Juanchopanzas Antwort etwas zu erweitern ...

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

macht dies:

  1. Erstellen Sie i und setzen Sie es auf 0.
  2. Setzen Sie i auf Main.size() - 1. Da Main leer ist, ist Main.size()0 und i wird auf -1 gesetzt.
  3. Main[-1] ist ein Zugriff außerhalb der Grenzen. Kaboom.
5
Mike DeSimone

Nur ein Ratschlag ... Anstatt zu schreiben 

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

wie oben vorgeschlagen, schreibe ein:

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

Iteratoren verwenden. Wenn Sie C++11-Unterstützung haben, können Sie i als auto i=Main.begin() deklarieren (nur eine praktische Verknüpfung).

Dies vermeidet den fiesen one-position-out-of-bound -Fehler, der durch das unbeabsichtigte Auslassen eines -1 verursacht wird.

4
phoeagon

1 ..__ In der Schleife weisen Sie einen Wert zu, anstatt einen Wert zu vergleichen 

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

Main [i] ergibt "Vector Subscript out of Range" coz i = -1.

2 . Sie erhalten Main.size () als 0, da sie die Datei nicht finden kann. Geben Sie den Dateipfad an und überprüfen Sie die Ausgabe. Es wäre auch gut, die Variablen zu initialisieren.

1
Shriraj
#include <iostream>
#include <fstream>
#include <vector>
using namespace std;

int main()
{
fstream dataFile;
string name , Word , new_Word;
vector<string> test;
char fileName[80];
cout<<"Please enter the file name : ";
cin >> fileName;
dataFile.open(fileName);
if(dataFile.fail())
{
     cout<<"File can not open.\n";
     return 0;
}
cout<<"File opened.\n";
cout<<"Please enter the Word : ";
cin>>Word;
cout<<"Please enter the new Word : ";
cin >> new_Word;
while (!dataFile.fail() && !dataFile.eof())
{
      dataFile >> name;
      test.Push_back(name);
}
dataFile.close();

}
0
muhammadOsama