2010-09-26 6 views
0

J'ai essayé de lire des entiers à partir d'un fichier, de faire quelques opérations et de les sortir dans un autre fichier. Lorsque j'introduis les nombres entiers dans un tableau et que j'imprime le résultat de trouver des nombres aléatoires. Est-ce quelque chose à voir avec ifstream que je ne comprends pas ou est-ce que je manque quelque chose d'évident?nombres entiers aléatoires ifstream?

#include<iostream> 
#include<fstream> 
using namespace std; 

int main(){ 
    int i=0, test[100]; 
    ifstream reader("in.txt"); 
    while(!reader.eof()){ 
     reader>>test[i]; 
     i++; 
    } 
    for(int x=0; test[x]!=-1; x++) 
     cout<<test[x]<<endl; 
    return 0; 
} 

échantillon in.txt:

1 4 3 2 9 8 18 22 0 
2 4 8 10 0 
7 5 11 13 1 3 0 
-1 

0 et -1 sont pour EOL et factionnaires eof respectivement

S'il y a un moyen beaucoup plus simple de faire cela, je voudrais aussi sache que. Je suis plutôt nouveau au C++ et je déteste la façon dont les tableaux se comportent par rapport aux autres langues.

+0

Avez-vous d'utiliser des tableaux de c? Pouvez-vous utiliser stl :: vector à la place? –

+0

@B Johnson. Non. J'ai besoin de pouvoir les lire ligne par ligne. – cdbitesky

+0

@everyone Je suis allé avec un sstream pour chaque ligne à getline puis traiter toutes les données. Les vecteurs semblent être beaucoup plus utiles que les tableaux, merci à tous pour les réponses. – cdbitesky

Répondre

1
sizeof(test)/sizeof(test[0]) 

C'est un calcul de la compilation: il donne toujours 100. Si vous voulez savoir combien entiers vous lisez en fait, vous devez garder une trace de vous-même (ou utiliser un récipient qui conserve la trace de cela pour vous, comme un std::vector).

En outre, le test .eof() dans la condition de boucle est incorrect et la boucle ne se terminera pas au bon moment. Si une extraction échoue, l'état d'échec sur le flux sera défini et d'autres extractions échoueront. La bonne façon de faire est:

// make sure to test the array bound and test that the extraction succeeded: 
while((i < 100) && (reader >> test[i])) 
{ 
    i++; 
} 

Vous pouvez alors tester l'état du cours d'eau afin de déterminer si la boucle est terminée en raison d'une panne d'extraction ou parce que EOF a été atteint. Si ce n'était pas le cas, alors i devrait être 100 et vous aurez rempli le tableau.

Vous pouvez lire this article pour plus de détails sur la manière correcte de procéder.

0

Utilisez un vecteur plutôt qu'un tableau.

vector<int> test

Y at-il réellement 0 et -1 dans le texte du fichier? Je peux mal vous comprendre sur ce point, mais ils ne devraient pas littéralement être dans le fichier texte.

Alors, essayez ceci:

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

int main(){ 
    int i=0, tmp; 
    vector<int> test; 
    ifstream reader("in.txt"); 
    while((i < 100) && (reader >> tmp)) 
    { 
     test.push_back(tmp); 
     i++; 
    } 
    for(int x=0; x < test.size(); x++) 
     cout<<test[x]<<endl; 
    return 0; 
} 

Votre plus grand défaut dans votre code est que vous utilisez la taille du tableau après avoir défini à 100. Ce n'est pas le même que le nombre de Les entiers sont lus, de sorte que les 100 éléments du tableau continuent d'être imprimés.

Modifier ajouté suggestion d'autre réponse

+1

Il n'est pas nécessaire de limiter 'i' à 100 si vous utilisez un vecteur. En fait, vous n'avez même pas besoin de «je» du tout. – Paul

1

L'évidence de façon plus simple serait d'utiliser std :: vector:

#include <vector> 
#include <iostream> 
#include <algorithm> 
#include <numeric> 
#include <fstream> 
#include <iterator> 

int main() { 
    std::vector<int> test; 
    std::ifstream reader("in.txt"); 

    // read the data into the vector: 
    std::copy(std::istream_iterator<int>(reader), 
       std::istream_iterator<int>(), 
       std::back_inserter(test)); 

    // show the data in the vector: 
    std::copy(test.begin(), 
       test.end(), 
       std::ostream_iterator<int>(std::cout, "\t")); 

    // Just for fun, display the average of the numbers: 
    std::cout << "Mean = " 
       << std::accumulate(test.begin(), test.end(), 0)/test.size(); 

    return 0; 
} 
+0

Ceci ne lit pas la dernière ligne du fichier. – cdbitesky

+0

@cdbitesky: Il devrait certainement. Ma conjecture est que vous avez mélangé cela avec un autre code qui * ignore * traitant de cette dernière ligne qui a été lue, parce que votre code original (avec 'while (! Reader.eof())') semblait lire la dernière ligne deux fois. –

Questions connexes