2010-09-05 24 views
1

Bonjour,adapter un casting ancienne d'un std :: streampos être g ++ 4.4 compatible

Je tente d'obtenir un code à l'ancienne pour fonctionner en g ++ 4.4. Ma compréhension est le code compilé très bien en g ++ 4.0, mais g ++ est devenu plus strict entre 4.0 et 4.4. Ce code provoque notamment le compilateur d'arrêter et de se plaindre:

sprintf(s,"%.7d",(long)tellp()); 

tellp() est un objet std :: streampos. L'appel ci-dessus à sprintf se produit dans une classe dérivée d'une classe std :: fstream. Le code permet à de convertir des données indiquant la position d'un objet fstream en un type numérique, de sorte qu'il puisse être transmis à un deuxième programme en cours (via un fichier) afin que le 2ème programme puisse rapidement certaines données dans un fichier.

Existe-t-il un moyen simple de sauver cela, avec une distribution g ++ serait heureux avec?

Le message d'erreur:

error: format ‘%.7d’ expects type ‘int’, but argument 3 has type ‘std::streamoff’ 

Répondre

3

Il ne semble pas être un moyen portable pour ce faire, puisque std :: FPOS est mise en œuvre essentiellement définie. Cela dit, gcc ne traite pas un std :: streampos autant que n'importe quel nombre. D'un autre côté, vous pouvez le convertir en un fichier std :: streamoff, qui est dépendant de l'architecture pour son type réel, mais il est en quelque sorte typedef à long ou long long ou autre. Soustrayez le décalage souhaité de la première position du flux et il renvoie std::streamoff qui peut être converti de manière triviale en long.

1

Le problème que% d nécessite un int et que vous lancez longtemps n'est-il pas le problème?

Devrait-il s'agir de "% .7ld"?