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
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.
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:
i
et définissez-le sur 0
.i
sur Main.size() - 1
. Puisque Main
est vide, Main.size()
est 0
et i
est défini sur -1
.Main[-1]
est un accès hors limites. Kaboom.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
.
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.
#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();
}