2010-01-28 8 views
0

J'ai le contenu d'un fichier affecté à un objet chaîne. Pour des raisons de simplicité, le fichier n'a que 5 octets, ce qui correspond à la taille de 1 entier plus un autre octet. Ce que je veux faire est d'obtenir les quatre premiers octets de l'objet chaîne et de le stocker en quelque sorte dans une variable entière valide par le programme. Ensuite, le programme effectuera diverses opérations sur l'entier, en le modifiant. Ensuite, je veux que l'entier modifié soit stocké dans les quatre premiers octets de l'objet chaîne.Lecture/écriture de valeurs entières sur un objet chaîne

Quelqu'un pourrait-il me dire que je pourrais y parvenir? Je préférerais rester avec la bibliothèque C++ standard exclusivement à cet effet. Merci d'avance pour votre aide.

+0

Est-ce que ce sont les devoirs? – sbi

+0

Je n'ai même pas suivi de cours de programmation auparavant. Merci à toutes les réponses pertinentes au problème. – kaykun

+1

Oh, je viens de voir ceci: Voulez-vous dire que l'entier est stocké _binary_? Alors ma réponse est un non-sens. Je vais le supprimer. – sbi

Répondre

2

L'extrait de code suivant doit illustrer une poignée de choses. Méfiez-vous des différences endian. Joue avec. Essayez de comprendre ce qui se passe. Ajouter quelques opérations de fichier (lecture binaire & écriture). La seule façon de vraiment comprendre comment faire cela est d'expérimenter et de créer des tests.


#include <iostream> 
#include <string> 

using namespace std; 

int main(int argc, char *argv[]) { 
    int a = 108554107; // some random number for example sake 

    char c[4];   // simulate std::string containing a binary int 
    *((int *) &c[0]) = a; // use casting to copy the data 

    // reassemble a into b, using indexed bytes from c 
    int b = 0; 
    b |= (c[3] & 0xff) << 24; 
    b |= (c[2] & 0xff) << 16; 
    b |= (c[1] & 0xff) << 8; 
    b |= c[0] & 0xff; 

    // show that all three are equivalent 
    cout << "a: " << a << " b: " << b 
     << " c: " << *((int *) &c[0]) << endl; 

    return 0; 
} 
+0

Merci beaucoup. * ((int *) & c) fonctionne exactement comme je le veux pour convertir une séquence char en un entier. – kaykun

+0

Veuillez noter que la conversion de n'importe quelle adresse de mémoire en types plus importants peut entraîner des erreurs d'alignement du processeur. C'est bien sur les processeurs x86 car ils vous permettent de le faire, mais à peu près tous les autres processeurs vont générer un défaut d'alignement. Si vous voulez que votre code soit multiplate-forme, vous pouvez utiliser memcpy au lieu de * (int *). par exemple. int i; memcpy (& i, c, taille de (i)); –

+0

Merci pour l'info, je l'ai juste fait fonctionner avec memcpy. Je vais l'utiliser à partir de maintenant. – kaykun

0

Si vous lisez std::string à partir de ce fichier, tout octet nul signalerait la fin de la chaîne, vous pourriez donc vous retrouver avec une chaîne plus courte que 5 octets. Jetez un oeil here pour savoir comment faire E/S binaires avec des flux C++.

+0

Je peux vérifier que l'objet de chaîne avec lequel je travaille a la taille correcte en tant que fichier, même avec un octet nul. Sur le site que vous avez lié, dans la section sur la lecture des données, il utilise myFile.read (buffer, 100); avec myFile étant un objet ifstream et le tampon étant un tableau char. Je veux lire les quatre premiers octets comme une variable int normale, pas un tableau char. – kaykun

+0

Consultez la section "Lecture/écriture de données autres que des caractères". Il suffit de lire dans votre int, sans chaîne intermédiaire. –

Questions connexes