Lecture binaire istream byte by byte
Je tente de lire un fichier binaire octet par octet à l'aide d'un ifstream. J'ai utilisé istream méthodes get() avant de lire l'intégralité des morceaux d'un fichier binaire à la fois sans problème. Mais ma tâche actuelle se prête à aller octet par octet et en s'appuyant sur la mise en tampon de l'oi-système pour le rendre efficace. Le problème est que je semble atteindre la fin du fichier de quelques octets plus tôt que je ne l'. J'ai donc écrit le programme de test suivant:
#include <iostream>
#include <fstream>
int main() {
typedef unsigned char uint8;
std::ifstream source("test.dat", std::ios_base::binary);
while (source) {
std::ios::pos_type before = source.tellg();
uint8 x;
source >> x;
std::ios::pos_type after = source.tellg();
std::cout << before << ' ' << static_cast<int>(x) << ' '
<< after << std::endl;
}
return 0;
}
Ce vide le contenu du test.dat, un octet par ligne, montrant la position dans le fichier avant et après.
Bien sûr, si mon fichier arrive à avoir les deux octets de la séquence 0x0D-0x0A (ce qui correspond à un retour chariot et saut de ligne), ces octets sont ignorés.
- J'ai ouvert le flux en mode binaire. Ne devrait pas l'empêcher d'interprétation de la ligne de séparateurs?
- Faire l'extraction des opérateurs de toujours utiliser le mode texte?
- Quelle est la bonne façon de lire octet par octet binaire, istream?
MSVC++ 2008 sur Windows.
source d'informationauteur Adrian McCarthy
Vous devez vous connecter pour publier un commentaire.
L' >> extracteurs sont pour formatée d'entrée; ils ignorer les espaces blancs (par
valeur par défaut). Pour le seul caractère non formaté entrée, vous pouvez utiliser
istream::get()
(retourne unint
soit EOF si la lecture échoue, ouune valeur dans l'intervalle [0,UCHAR_MAX]) ou
istream::get(char&)
(met lecaractère lu dans l'argument, renvoie à quelque chose qui se convertissent
bool
true si la lecture du succès et false en cas d'échec.il y a un lire() membre de la fonction dans laquelle vous pouvez spécifier le nombre d'octets.
Pourquoi êtes-vous formaté à l'aide de l'extraction, plutôt que de
.read()
?vous donnera un seul octet. Il n'est pas formaté fonction d'entrée.
l'opérateur>> est formaté en fonction d'entrée qui peut signifier sauter les caractères espace.
Comme d'autres l'ont mentionné, vous devez utiliser
istream::read()
. Mais, si vous devez utiliser formaté d'extraction, de considérerstd::noskipws
.