Je ne comprend pas ce que tu entends par 4 caractères... 4 octets? 4 entiers?Citation:
Envoyé par sone47
Thierry
Version imprimable
Je ne comprend pas ce que tu entends par 4 caractères... 4 octets? 4 entiers?Citation:
Envoyé par sone47
Thierry
J'ai peur de comprendre.
Tu utilises fread pour lire des entiers dans un fichier texte, c'est ça ?
fread et fwrite sont plutôt faits pour travailler sur des fichiers binaires, sur des octets.
Si tu veux travailler sur des fichiers texte, utilise plutôt fgets et fprintf.
oui 4 entier
Je voulais a l'origine travailler sur un entier a la fois.
ici dans mon fichier d'entré j'ai une suite 123456789 et en sortie pour une taille d'un int a raison d'une quantité unitaire je recupere 1234
Et pour travailler sur un fichier binaire et étudié bit apres bit, quel taille doit on rentrer.
Merci.
Dans le code que tu as montré, tu ne lis qu'un entier depuis le fichier de sortie et tu n'écris qu'un seul entier dans le fichier de destination.Citation:
Envoyé par sone47
Es-tu sur d'avoir un fichier binaire? Si tu a écrit "1234" à l'aide d'un éditeur de texte, tu as en fait un fichier contenant 4 octets correspondant aux code des caractères '1', '2', '3', '4' (en encodage ascii ou latin-1 ou autre).
Lorsque tu crois lire un entier avec ta fonction fread, tu lis en fait les 4 octets contenus dans ton fichier dans nbo. Ainsi, les 8 bits de poids faible de la variable nbo, qui est type int 32 bits (sur ma machine) la valeur correspondant au caractère '1'. Lorsque tu écris la valeur de nbo sur le flux de sortie, tu copies également les 4 octets contenus dans la variable nbo.
Si tu désire travailler avec un fichier binaire, il ne faut pas le créer avec un éditeur de texte, mais avec la fonction fwrite.
Thierry
Tu as saisi la valeur 123456789 à l'aide d'un éditeur de texte?Citation:
Envoyé par sone47
Thierry
Ben oui, c'est logique. Un int fait (sur ta machine) la taille de 4 char (qui est l'unité de mesure de taille en C).Citation:
Envoyé par sone47
Comme je te l'ai dit juste au dessus, si tu utilises des fichiers texte, il faut appeler fgets et fprintf plutôt que fread et fwrite.
Un article dont la lecture te sera profitable : http://emmanuel-delahaye.developpez.com/inputs.htm
Tu dois créer ton fichier binaire de la manière suivante:Citation:
Envoyé par sone47
Code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20 #include <stdio.h> #include <stdlib.h> int main(void) { int tableau[9] = {1,2,3,4,5,6,7,8,9}; FILE *fichier = fopen("fichier_in", "wb"); if (fichier_in == NULL) { fprintf(stderr, "L'ouverture a échoué!\n"); exit(EXIT_FAILURE); } fwrite(tableau, sizeof(tableau[0]), sizeof(tableau), fichier); fclose(fichier); return EXIT_SUCCESS; }
Merci
Si j'ai bien compris lorsque je tape un chiffre dans l'éditeur de texte,
ce chiffre vaut un octet alors que dans mon programme sa valeur depend du type dans lequel on l'a définit.
Il est donc impossible d'etre en lecture ecriture texte et de lire seulement un octet dans un fichier.
Est t il possible de lire un fichier ligne par ligne (donc sans savoir le nbr d'élément de la ligne) ou de terminer la lecture a un moment précis (en binaire)
Merci de votre aide depuis le début
Tu peux lire une ligne d'un flux associé à un fichier texte à l'aide de la fonction fgets:Citation:
Envoyé par sone47
http://man.developpez.com/man3/fgets.3.php
Salutations
Thierry
En binaire est il possible de lire un fichier d'arreter la lecture puis de la reprendre au meme endroit qu'on l'a arreter precedemment.
Y a t il une technique si l'on veut utiliser fread.
Vice versa si l'on veut faire different fwrite mais sans qui se suivent dans le fichier de sortie
En binaire, il n'y a pas de ligne. Il y a des octets.Citation:
Envoyé par sone47
Lire "ligne par ligne" n'a de sens que pour un fichier texte.
oui, fseek.Citation:
Envoyé par sone47
Là, je ne comprend plus bien ce que tu veux faire. Le mieux est de faire un choix: tu veux travailler en binaire ou avec des fichiers texte. Ensuite, tu définis un micro-projet qui te servira à expérimenter.Citation:
Envoyé par sone47
Peut-être est-il préférable que tu précises exactement ce que tu désires faire afin de recevoir l'aide la plus efficace possible.
Thierry
+1, parce que là, c'est en train de partir dans tous les sens...Citation:
Envoyé par mujigka
WTF ? Si tu ne connais pas la structure du fichier, tu ne va rien pouvoir récupérer du tout (à part une séquence d'octets sans signification particulière).Citation:
Envoyé par sone47
On ne programme pas au hasard. Pas de spécifications, pas de code.
C'est un projet scolaire ? industriel ? personnel ?
Bonsoir,
je vous remercie pour toute l'aide que vous m'avez apporté cette apres midi;
c'est un projet personnel mais non définit qui me permet de me familiariser avec la manipulation de fichier.
Au tout début je voulais juste retranscrire un fichier pour voir comment cela fonctionnait et grace a l'aide que j'ai eut sur ce forum j'ai pu a chaque fois rajouter un autre type d'utilisation que je ne comprennais pas.
Au début je partais d'un fichier texte et désormais je rentre dans un fichiers des valeurs issues d'un tableau. Et je voudrais juste lire ces valeurs(dans le fichier d'entré) les transformer une par une une simple multiplication) et arreter cette lecture écriture lorsqu'il n'y a plus rien a lire.
Merci
A moins d'etre absolument certain que le fichier inital contient bien au moins 10 elements de la taille specifier, on ne fait pas ce genre de traitement. En effet si le nombre d'elements lisibles dans le fichier est plus petit, les elements surnumeraires auront une valeur quelconque et la taille des deux fichiers sera differentes.Citation:
Envoyé par sone47
fread() retournant le nombre d'element reelement lus, on ecrit plutot :
Code:
1
2
3
4 int nb_lu; nb_lu = fread (ptr, sizeof(int), 10, in); fwrite (ptr, sizeof(int), nb_lu, out);
Il faut aussi tester si on a pas une fin de lecture. Avec fread(), c'est un peu tordu...Citation:
Envoyé par gl
Qu'entends tu par fin de lecture ? Si tu parles de la fin de fichier, on se retrouve justement dans un cas ou le nombre lu est inferieur au nombre demande, il suffit ensuite eventuellement de faire appel a feof() ou ferror() pour determiner si il s'agit de la fin du fichier ou d'une erreur de lecture.Citation:
Envoyé par Emmanuel Delahaye
Le petit bout de code fournit gere ces deux cas de la meme maniere en copiant le nombre d'elements reelement lus dans le fichier destination.