Question

Je suis en train de lire un fichier à un offset spécifique (version simplifiée):

typedef unsigned char u8;
FILE *data_fp = fopen("C:\\some_file.dat", "r");
fseek(data_fp, 0x004d0a68, SEEK_SET); // move filepointer to offset
u8 *data = new u8[0x3F0];
fread(data, 0x3F0, 1, data_fp);
delete[] data;
fclose(data_fp);

Le problème est, que les données ne contiendra pas 1008 octets, mais 529 (semble aléatoire). Quand il atteint 529 octets, les appels à feof (data_fp) va commencer le retour vrai.

J'ai aussi essayé de lire en petits morceaux (8 octets à la fois), mais il semble tout comme il est frappant EOF quand il est pas encore là.

Un simple coup d'oeil dans un éditeur hexadécimal montre il y a beaucoup d'octets gauche .

Était-ce utile?

La solution

Ouverture d'un fichier en mode texte, comme vous faites, la bibliothèque fait traduire une partie du contenu de fichiers à d'autres choses, pourrait déclencher une EOF injustifiée ou mauvais calculs de compensation.

Ouvrez le fichier en mode binaire en passant l'option « b » à l'appel fopen

fopen(filename, "rb");

Autres conseils

Le fichier est en cours d'écriture en parallèle par une autre application? Peut-être il y a une condition de course, de sorte que les extrémités de fichier à chaque fois que la lecture s'arrête, lorsque la lecture est en cours d'exécution, mais plus tard, lorsque vous inspectez le reste a été écrit. Cela expliquerait le caractère aléatoire aussi.

Peut-être qu'il ya une différence entre le fichier texte et binaire. Si vous êtes sous Windows, sont CRLF des sauts de ligne, ce qui est deux caractères dans le fichier, mais convertis en une seule fois lu. Essayez d'utiliser fopen (..., "rb")

Je ne peux pas voir votre lien de travail, mais si vos revendications ordinateur ne plus d'octets existent, je tendraient à le croire. Pourquoi ne pas imprimer la taille du fichier plutôt que de faire les choses à la main dans un éditeur hexadécimal?

En outre, vous seriez mieux en utilisant le niveau 2 E / S les appels f-sont anciens C laideur, et que vous utilisez C ++ depuis que vous avez de nouveau.

int fh =open(filename, O_RDONLY);
struct stat s;
fstat(fh, s);
cout << "size=" << hex << s.st_size << "\n";

Maintenant, faites votre recherche et la lecture de niveau 2 E / S à l'aide d'appels, qui sont plus rapides de toute façon, et nous allons voir ce que la taille du fichier vraiment est.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top