2009-03-01 6 views
2

Existe-t-il une fonction pour FICHIER (fopen?) qui me permet de lire simplement un int à partir d'un fichier binaire? Jusqu'ici j'essaye cela, mais j'obtiens une sorte d'erreur que je ne peux pas voir parce que le programme se bloque juste sans me dire.Fonction readInt C++ FILE? (à partir d'un fichier binaire)

void opentest() 
{ 
    FILE *fp = fopen("dqmapt.mp", "r"); 
    int i = 0; 
    int j = 0; 
    int k = 0; 
    int * buffer; 
    if (fp) 
    { 
     buffer = (int *) (sizeof(int)); 

     i = (int) fread(buffer,1, (sizeof(int)), fp); 
     fscanf(fp, "%d", &j); 
     fclose(fp); 
    } 

    printf("%d\n", i); 
    printf("%d\n", j); 
} 
+0

-1 pour une question non claire. Aucune mention si vous voulez l'int stocké dans binaire pour, comme texte, ou un autre format. Ce n'est pas une question très utile car elle demande comment utiliser une interface C héritée en C++. Utilisez plutôt iostreams. – flodin

+0

Vous ne devez pas le voter parce qu'il ne connaissait pas la bonne question à poser. –

+0

Était "buffer = (int *) (sizeof (int));" censé être un appel à malloc() ou quelque chose? – bk1e

Répondre

7

Maintenant que vous avez changé votre question, laissez-moi en poser une. Quel est le format du fichier que vous essayez de lire?

Pour un fichier binaire il y a des changements nécessaires que vous ouvrez le fichier:

/* C way */ 
FILE *fp = fopen("text.bin", "rb"); /* note the b; this is a compound mode */ 

/* C++ way */ 
std::ifstream ifs("test.txt", ios::in | ios::binary); 

lecture dans le contenu est facile. Mais rappelez-vous, votre fichier a 2 nombres entiers au début - largeur, hauteur qui déterminent combien de plus à lire, c'est-à-dire une autre largeur * hauteur nombre d'entiers. Donc, votre meilleur pari est de lire les deux premiers entiers en premier. Vous devrez utiliser deux tampons - un pour la largeur et la hauteur et ensuite en fonction de leur valeur un autre pour lire le reste du fichier. Ainsi, Lisons dans les deux premiers entiers:

char buf[ 2 * sizeof(int) ]; /* will store width and height */ 

Lire dans les deux entiers:

/* C way */ 
fread(buf, sizeof(int), 2, fp); /* the syntax changes, FILE pointer is last */ 

/* C++ way*/ 
ifs.read(buf, sizeof buf); 

Maintenant, la partie la plus délicate. Vous devez convertir les choses en double. Cela dépend également de l'endianness de votre système - si une simple affectation fonctionne ou si un échange d'octets est nécessaire. Comme une autre affiche a souligné WriteInt() écrit entiers dans le format big-endian. Déterminez le système sur lequel vous êtes. Et puis vous pouvez aller plus loin.

FILE est une structure de données C.Il est inclus dans C++ pour la compatibilité C. Vous pouvez le faire:

/* The C way */ 
#include <stdio.h> 
#include <stdlib.h> 

int main(void) { 
    FILE *fp = fopen("test.txt", "r"); 
    int i = 0; 
    if (fp) { 
     fscanf(fp, "%d", &i); 
     fclose(fp); 
    } 
    printf("%d\n", i); 
} 

Vous pouvez utiliser la chose std::ifstream pour ouvrir un fichier pour la lecture. Vous devez lire le contenu en utilisant une autre incantation pour lire le contenu du fichier et en extraire vous-même les informations souhaitées.

/* The C++ way */ 
#include <fstream> 
#include <iostream> 

int main() { 
    std::ifstream ifs("test.txt"); 
    int i = 0; 
    if (ifs.good()) { 
     ifs >> i; 
    } 
    std::cout << i << std::endl; 
} 

Notez que vous pouvez utiliser les fonctions de style C en C++ et, bien que ce soit la moins recommandée:

/* The C way in C++ */ 
#include <cstdio> 
#include <cstdlib> 

int main() { 
    using namespace std; 
    FILE *fp = fopen("test.txt", "r"); 
    int i = 0; 
    if (fp) { 
     fscanf(fp, "%d", &i); 
     fclose(fp); 
    } 
    printf("%d\n", i); 
} 

[Note: Les deux exemples supposent que vous avez un fichier texte à lire de]

+0

Pourriez-vous me dire comment faire cela avec un fichier binaire? – William

+0

Vous devez spécifier le format du fichier binaire :) – dirkgently

+0

Il provient de la méthode writeInt() de Java. C'est juste un fichier de carte simple. width, height, than un nombre d'ints égal à (width * height) – William

2

Voulez-vous lire une représentation textuelle d'un int? Ensuite, vous pouvez utiliser fscanf, il est un peu à l'opposé de printf

int n; 
if(fscanf(filePointer, "%d", &n) == 1) 
    // do stuff with n 

Si vous voulez lire des données binaires et de le traiter comme un entier, bien que ça va dépendre comment il a été écrit en premier lieu.


Je ne suis pas un programmeur Java, ceci est tout simplement basé sur ce que je l'ai lu dans les [documents] (http://java.sun.com/j2se/1.4.2/docs/api/java/io/DataOutputStream.html#writeInt(int)).

Cela dit, il dit

écrit un int pour le flux de sortie sous-jacent comme quatre octets, octet haut en premier.Si aucune exception n'est levée, le compteur écrit est incrémenté de 4.

Donc c'est un gros quatre octets entier. Je ne sais pas si c'est le complément de deux ou pas, mais c'est probablement une hypothèse sûre (et peut probablement être trouvé quelque part dans le java docs/spec). Big endian est le même que l'ordre des octets réseau, vous pouvez donc utiliser ntohl pour le convertir l'endianness de votre plate-forme C++. Au-delà de cela, vous avez juste besoin de lire les quatre octets, ce qui peut être fait avec fread.

+0

binaire, écrit en utilisant la méthode writeInt() de Java. Le fichier est "¬í wl" – William

0

Int représenté comme texte ou binaire?

Pour le texte, utiliser fscanf; pour binaire, utilisez fread.

Questions connexes