J’ai un énorme tableau contigu x
que je fread
d’un fichier.
Comment déposer ce bloc dans un std::vector
? En d’autres termes, je préfère avoir le résultat dans std::vector
plutôt que dans le tableau, mais je veux que le code C ++ résultant soit aussi efficace que cette version C simple, qui place le bloc directement dans le tableau.
En cherchant, je pense que je devrais peut-être utiliser placement-new sous une forme ou une autre, mais je ne suis pas sûr de la séquence d’appels et des problèmes de propriété. De plus, dois-je m’inquiéter des problèmes d’alignement?
Je teste avec T = unsigned
, mais je m’attends à ce qu’une solution raisonnable fonctionne pour toute structure de POD.
using T = unsigned; FILE* fp = fopen( outfile.c_str(), "r" ); T* x = new T[big_n]; fread( x, sizeof(T), big_n, fp ); // how do I get x into std::vector v // without calling a gazillion push_backs() or copies ?!? delete[] x; fclose( fp );
Vous utilisez le constructeur std::vector
qui définit la taille du vecteur et utilisez std::vector::data
pour obtenir un pointeur sur la mémoire allouée.
Garder avec votre utilisation de fread
:
std::vector x(big_n); fread(x.data(), sizeof(T), big_n, fp);
Comme l’ont noté d’autres personnes, l’utilisation de fread
si le type T
n’est pas un type POD ne fonctionnera probablement pas. Vous pouvez ensuite utiliser les stream C ++ et std::istreambuf_iterator
pour lire le fichier dans le vecteur. Cependant, cela a l’inconvénient de faire une boucle sur tous les éléments du fichier, et si big_n
est aussi gros que ça en a l’air, il peut s’agir d’un problème de performances.
Cependant, si le fichier est vraiment volumineux, je recommande plutôt d’utiliser un mappage de mémoire pour lire le fichier.
Cela lira le fichier dans un vecteur en utilisant
#include #include #include // ... std::ifstream testFile("testfile", std::ios::binary); std::vector fileContents((std::istreambuf_iterator (testFile)), std::istreambuf_iterator ());
Cette réponse provient d’une réponse précédente: https://stackoverflow.com/a/4761779/942596