web-dev-qa-db-fra.com

Comment lire un fichier en vectoriel en C++?

J'ai besoin de lire un fichier .data ou .txt contenant un nouveau numéro float sur chaque ligne dans un vecteur. 

J'ai parcouru de longues distances et appliqué de nombreuses méthodes différentes, mais chaque fois, le même résultat est obtenu: Main.size() of 0 et une erreur disant "Vector Subscript out of Range";.

Remarque: le fichier se trouve à la fois dans le dossier et également dans le projet VS.

Quoi qu'il en soit, voici mon 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;
}

Le résultat obtenu est toujours simple:

Numbers:
0
13
Orgmo

Votre boucle est fausse:

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

Essaye ça:

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

En outre, une façon plus idiomatique de lire des nombres dans un vecteur et de les écrire sur stdout est quelque chose du genre:

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

}

cependant, vous devez vérifier l’état de la variable ifstream pour rechercher les erreurs de lecture.

29
juanchopanza

Juste pour développer un peu la réponse de juanchopanza ...

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

est ce que ca:

  1. Créez i et définissez-le sur 0.
  2. Définissez i sur Main.size() - 1. Puisque Main est vide, Main.size() est 0 et i est défini sur -1.
  3. Main[-1] est un accès hors limites. Kaboom.
5
Mike DeSimone

Juste un conseil ... au lieu d'écrire 

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

comme suggéré ci-dessus, écrivez un:

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

utiliser iterators. Si vous avez le support C++11, vous pouvez déclarer i en tant que auto i=Main.begin() (un raccourci pratique cependant)

Cela évite l’erreur méchante une-position-hors-limite causée par l’omission involontaire d'un -1.

4
phoeagon

1 . Dans la boucle, vous affectez une valeur plutôt que de la comparer pour 

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

Main [i] donnera "Indice de vecteur en dehors de la plage" coz i = -1.

2 . Vous obtenez Main.size () comme 0 peut-être parce que ce n'est pas, il ne peut pas trouver le fichier. Donnez le chemin du fichier et vérifiez le résultat. En outre, il serait bon d’initialiser les variables.

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