2010-09-25 16 views

Répondre

3

les flux C de ne sont pas compatibles avec les flux de C. En d'autres termes, vous ne pouvez pas utiliser les itérateurs C++ avec FILE* ou fread. Toutefois, si vous utilisez les installations C++ std::fstream avec istream_iterator, vous pouvez utiliser un itérateur d'insertion à insérer dans un conteneur C++.

En supposant que vous avez un fichier d'entrée « input.txt » qui contient les numéros de texte ASCII séparés par des espaces, vous pouvez faire:

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

int main() 
{ 
std::ifstream ifs("input.txt"); 
std::vector<int> vec; 
    // read in the numbers from disk 
std::copy(std::istream_iterator<int>(ifs), std::istream_iterator<int>(), std::back_inserter(vec)); 
    // now output the integers 
std::copy(vec.begin(), vec.end(), std::ostream_iterator<int>(std::cout, "\n")); 
} 
+0

peut vous indiquer la fin du flux par exemple à lire 5 entiers? – user963241

+0

Oui, vous pouvez utiliser 'std :: copy_n' qui inclut un paramètre count. –

1

pas vous ne pouvez pas. Et c'est fondamentalement non portable pour stocker int comme ça. Votre code va se casser si vous écrivez votre fichier avec une machine big-endian et essayez de le lire avec une machine little-endian.

Mais personne ne vous en empêche. Il suffit de définir votre propre itérateur avant qui lit binaire à partir d'un istream. Vous voudrez probablement arrêter d'utiliser FILE et la fonction fread/fopen/fclose car ils proviennent de l'ère C.

alors vous serez en mesure d'écrire:

std::copy_n(your_custom_forward_iterator, count, back_inserter<std::list<....> >);