Question

Wow j'ai été dans tous les sens des questions aujourd'hui et je me excuse si elles semblent se recouper, mais pour chaque question est une autre question ... Comme une chose wont work ...... mais je devrais utiliser quelque chose d'autre ...... etc.

Quoi qu'il en soit, j'ai un fichier texte:

6
3.0 2.5 -1.5 0.0 1.7 4.0
6 10

6 est le nombre de « flotte » dans la deuxième ligne (la 3.0,2.5 etc ...) 3.0,2.5, -1,5 sont toutes une série de flotteurs. 6 et 10 ne sont que deux des nombres entiers.

J'ai un vecteur

std::vector<double> numbers;

Tout besoin i faire, est d'obtenir la deuxième ligne mis en nombres. Donc maintenant je

ifstream myfile (filename.c_str());

Je peux simplement faire juste un mon_fichier >> pour obtenir la première valeur (6) mais comment pourrais-je aller à mettre la deuxième ligne dans mon vecteur? Se souvenir Je sais seulement la taille de la ligne 2 est, en lisant dans la première ligne (6 dans ce cas).

De plus, les 2 derniers chiffres ne sont pas censés être dans ce vecteur, mais deux valeurs séparées. Ce que je peux faire mon_fichier >> a >> b.

Désolé encore pour sooo beaucoup de questions. mais je l'ai littéralement cherché partout et demandez probablement les mauvaises questions.

Était-ce utile?

La solution

quelque chose comme:

int count, a, b;
double tmp;
std::vector<double> numbers;
ifstream myfile (filename.c_str());
myfile >> count;
for(int i = 0; i < count; ++i) {
    myfile >> tmp; numbers.push_back(tmp);
}
myfile >> a >> b;

Autres conseils

myfile >> numElements;
numbers.resize(numElements);
for (int i = 0; i < numElements; i++) {
    myfile >> numbers[i];
}
myfile >> a >> b;

Je vais commencer à partir du point où vous avez déjà lu dans la ligne du fichier, car il semble que vous êtes OK avec ça. Ceci est l'approche la plus fondamentale. Mon code ci-dessous illustre cette approche en utilisant le code très simple qui pourrait être utilisé pour comprendre comment cela fonctionne.

  1. Obtenir la ligne que vous souhaitez analyser dans un string, c'est line dans mon code ci-dessous.
  2. Rechercher les string pour les jetons, chaque jeton est séparé par tout ce qui est pas non plus un chiffre, une décimale, ou un signe négatif
  3. Pour chaque jeton, convertir la chaîne en un double en utilisant stringstream.
  4. Ajoutez la double à votre vecteur converti

A la fin de la boucle, je vide aussi le vecteur à l'écran pour l'inspection.

#include <string>
#include <vector>
#include <sstream>
#include <iostream>
#include <iterator>
using namespace std;

int main()
{
    string line = "3.0 2.5 -1.5 0.0 1.7 4.0";
    vector<double> doubles;

    string::size_type n_begin = 0;
    string::size_type n_end = line.find_first_not_of("-.0123456789", n_begin);
    while( n_begin != string::npos )
    {
        string cur_token = line.substr(n_begin, n_end-n_begin);
        stringstream ss;
        ss << cur_token;
        double cur_val = 0.0;
        ss >> cur_val;
        doubles.push_back(cur_val);
        // set up the next loop
        if( n_end == string::npos )
            n_begin = n_end = string::npos;
        else
        {
            n_begin = n_end + 1;
            n_end = line.find_first_not_of("-.0123456789", n_begin);
        }
    }

    copy(doubles.begin(), doubles.end(), ostream_iterator<double>(cout, "\n"));
}

Avez-vous des copy_n() dans votre arsenal?

template<class In, class Size, class Out>
Out copy_n(In first, Size n, Out result)
{
    while( n-- ) *result++ = *first++;
    return result;
}

Mettez un endroit où vous pouvez facilement #include dans d'autres unités de traduction. C'est utile. Utilisez-le comme suit pour copier vos n valeurs à virgule flottante:

copy_n(std::istream_iterator<double>(std::cin),
       n,
       std::back_inserter(v));
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top