OVH Cloud OVH Cloud

déplacer un morceau de fichier de taille connue

27 réponses
Avatar
Marc G
je voudrais savoir si mon code est correct, où s'il existe une autre méthode
file_ est un fstream


size_t size=500;
char* ptr=new char[size];
the_file.read(ptr,size);

// je me balade dans le fichier à l'endroit où je veux écrire

the_file.write(ptr,size);
delete[] ptr;

merci à vous
Marc

10 réponses

1 2 3
Avatar
Michael DOUBEZ
Michael DOUBEZ writes:

Michael DOUBEZ writes:

je voudrais savoir si mon code est correct, où s'il existe une autre
méthode
file_ est un fstream
size_t sizeP0;
char* ptr=new char[size];
the_file.read(ptr,size);
Utilises gcount() pour connaitre le nombre d'octet effectivement

lus ou
utilises readsome()?
Pourquoi utiliser readsome dans ce contexte? Ca n'a pas tellement

d'intérêt en dehors des stream que l'on sait interactive il me semble.
Pour etre coherent avec une lecture en fin de fichier.



readsome ne fait que lire ce qui a deja ete bufferise dans le streambuf.
J'ai du mal a voir la coherence, surtout quand on considere qu'il
parle de
faire des mouvements avant, ce qui impliquerait que rien n'est
bufferise a
ce moment.


Je n'ai pas compris ce que faisait readsome alors.
Désolé pour le mauvais conseil.


J'aimerais être sûr d'avoir compris ce que tu as dit: tu veux dire que
readsome ne lira pas dans le fichier mais uniquement dans le buffer
associé ?

Ma compréhension était que readsome ne levait pas eofbit quand il
arrivait a la fin du fichier mais a part cela etait équivalent à un read
et gcount dans le cas d'un fichier.

Michael






Avatar
Jean-Marc Bourguet
James Kanze writes:

On Nov 13, 9:06 pm, Jean-Marc Bourguet wrote:
Michael DOUBEZ writes:
je voudrais savoir si mon code est correct, où s'il existe une autre
méthode
file_ est un fstream
size_t sizeP0;
char* ptr=new char[size];
the_file.read(ptr,size);


Utilises gcount() pour connaitre le nombre d'octet
effectivement lus ou utilises readsome()?


Pourquoi utiliser readsome dans ce contexte?


Sans doute pour la même raison que beaucoup de gens utilisent
rdbuf()->in_avail() : parce qu'ils en ont mal compris la
sémantique.


Si au moins in_avail retournait egptr() - gptr() + showmanyc()

(La flemme de regarder, comment showmanyc interagit avec les mapping
CR/LF->LF? Mal je suppose pour rendre encore la chose encore moins
utilisable.)

A+

--
Jean-Marc
FAQ de fclc++: http://www.cmla.ens-cachan.fr/~dosreis/C++/FAQ
C++ FAQ Lite en VF: http://www.ifrance.com/jlecomte/c++/c++-faq-lite/index.html
Site de usenet-fr: http://www.usenet-fr.news.eu.org




Avatar
Jean-Marc Bourguet
Michael DOUBEZ writes:

Michael DOUBEZ writes:

Michael DOUBEZ writes:

je voudrais savoir si mon code est correct, où s'il existe une autre
méthode
file_ est un fstream
size_t sizeP0;
char* ptr=new char[size];
the_file.read(ptr,size);
Utilises gcount() pour connaitre le nombre d'octet effectivement lus

ou
utilises readsome()?
Pourquoi utiliser readsome dans ce contexte? Ca n'a pas tellement

d'intérêt en dehors des stream que l'on sait interactive il me semble.
Pour etre coherent avec une lecture en fin de fichier.



readsome ne fait que lire ce qui a deja ete bufferise dans le streambuf.
J'ai du mal a voir la coherence, surtout quand on considere qu'il parle
de
faire des mouvements avant, ce qui impliquerait que rien n'est bufferise
a
ce moment.
Je n'ai pas compris ce que faisait readsome alors.

Désolé pour le mauvais conseil.


J'aimerais être sûr d'avoir compris ce que tu as dit: tu veux dire que
readsome ne lira pas dans le fichier mais uniquement dans le buffer associé
?


Ca peut lire dans le fichier si le buffer est vide et que showmanyc
retourne quelque chose > 0.

Ma compréhension était que readsome ne levait pas eofbit quand il
arrivait a la fin du fichier mais a part cela etait équivalent à un read
et gcount dans le cas d'un fichier.


eofbit peut etre mis. Sinon readsome fait un read de max(in_avail, count)
et retourne gcount().

Le plus simple est d'aller voir ici:

https://www.dinkumware.com/manuals/?manual=compleat&page=istream.html#basic_istream::readsome

A+

--
Jean-Marc
FAQ de fclc++: http://www.cmla.ens-cachan.fr/~dosreis/C++/FAQ
C++ FAQ Lite en VF: http://www.ifrance.com/jlecomte/c++/c++-faq-lite/index.html
Site de usenet-fr: http://www.usenet-fr.news.eu.org







Avatar
Michael DOUBEZ
On Nov 13, 9:06 pm, Jean-Marc Bourguet wrote:
Michael DOUBEZ writes:
je voudrais savoir si mon code est correct, où s'il existe une autre
méthode
file_ est un fstream
size_t sizeP0;
char* ptr=new char[size];
the_file.read(ptr,size);


Utilises gcount() pour connaitre le nombre d'octet
effectivement lus ou utilises readsome()?


Pourquoi utiliser readsome dans ce contexte?


Sans doute pour la même raison que beaucoup de gens utilisent
rdbuf()->in_avail() : parce qu'ils en ont mal compris la
sémantique.


in_avail() retourne le nombre de caractères pouvant être lut par read
sans bloquer. Je ne vois pas en quoi c'est incompatible avec readsome
sur un fichier, le nombre de caractères pouvant être lut etant bien ceux
entre le curseur courant et la fin du fichier.

streamsize readsome(char_type* s, streamsize n);

Effects: If !good() calls setstate(failbit) which may throw an
exception, and return. Otherwise extracts characters and stores them
into successive locations of an array whose first element is designated
by s . If rdbuf()->in_avail() == -1, calls setstate(eofbit) (which may
throw ios_base::failure (lib.iostate.flags)), and extracts no characters;

* If rdbuf()->in_avail() == 0, extracts no characters

* If rdbuf()->in_avail() > 0, extracts min(rdbuf()->in_avail(),n)).


Ca n'a pas tellement d'intérêt en dehors des stream que l'on
sait interactive il me semble.


Même quand on connaît le flux interactif, je ne suis pas sûr de
son utilité. Après un getline(), par exemple, il y a de fortes
chances qu'elle ne lit rien (au moins sous Unix ou Windows). Et
si l'utilisateur est assez pervers pour entrer des lignes plus
longues que le buffer, il risque de ne pas fonctionner comme on
veut non plus.


C'est vrai que les alternative à readline (comme dans un editeur texte)
sont plutot de la lecture caractère/caractère.

Michael




Avatar
Michael DOUBEZ
James Kanze writes:

On Nov 13, 9:06 pm, Jean-Marc Bourguet wrote:
Michael DOUBEZ writes:
je voudrais savoir si mon code est correct, où s'il existe une autre
méthode
file_ est un fstream
size_t sizeP0;
char* ptr=new char[size];
the_file.read(ptr,size);
Utilises gcount() pour connaitre le nombre d'octet

effectivement lus ou utilises readsome()?
Pourquoi utiliser readsome dans ce contexte?

Sans doute pour la même raison que beaucoup de gens utilisent

rdbuf()->in_avail() : parce qu'ils en ont mal compris la
sémantique.


Si au moins in_avail retournait egptr() - gptr() + showmanyc()

(La flemme de regarder, comment showmanyc interagit avec les mapping
CR/LF->LF? Mal je suppose pour rendre encore la chose encore moins
utilisable.)


Est ce que read fait la conversion CR/LF->LF ?

Michael





Avatar
Michael DOUBEZ
Michael DOUBEZ writes:

Michael DOUBEZ writes:

Michael DOUBEZ writes:

je voudrais savoir si mon code est correct, où s'il existe une autre
méthode
file_ est un fstream
size_t sizeP0;
char* ptr=new char[size];
the_file.read(ptr,size);
Utilises gcount() pour connaitre le nombre d'octet effectivement lus

ou
utilises readsome()?
Pourquoi utiliser readsome dans ce contexte? Ca n'a pas tellement

d'intérêt en dehors des stream que l'on sait interactive il me semble.
Pour etre coherent avec une lecture en fin de fichier.

readsome ne fait que lire ce qui a deja ete bufferise dans le streambuf.

J'ai du mal a voir la coherence, surtout quand on considere qu'il parle
de
faire des mouvements avant, ce qui impliquerait que rien n'est bufferise
a
ce moment.
Je n'ai pas compris ce que faisait readsome alors.

Désolé pour le mauvais conseil.
J'aimerais être sûr d'avoir compris ce que tu as dit: tu veux dire que

readsome ne lira pas dans le fichier mais uniquement dans le buffer associé
?


Ca peut lire dans le fichier si le buffer est vide et que showmanyc
retourne quelque chose > 0.

Ma compréhension était que readsome ne levait pas eofbit quand il
arrivait a la fin du fichier mais a part cela etait équivalent à un read
et gcount dans le cas d'un fichier.


eofbit peut etre mis. Sinon readsome fait un read de max(in_avail, count)
et retourne gcount().

Le plus simple est d'aller voir ici:

https://www.dinkumware.com/manuals/?manual=compleat&page=istream.html#basic_istream::readsome



D'accord, le problème est sur in_avail() a un état donné du flux.

streamsize in_avail();

If a read position is available, the member function returns egptr() -
gptr(). Otherwise, it returns showmanyc().

Dans le cas de l'OP, un readsome(buf,500) ne serait donc pas garanti de
lire dans le fichier si le get pointer est defini et contient des données.

Merci.

Michael








Avatar
Marc G
char* ptr=new char[size];


std::vector<char> buf (size);

the_file.read(ptr,size);


read (&buf[0], buf.size());


Merci de tes conseils.
En plus, tu me l'as déjà dit il y a quelques jours sur une autre question.
Mais je m'entête dans mes mauvaises habitudes...


Avatar
Fabien LE LEZ
On Thu, 15 Nov 2007 07:25:56 +0100, "Marc G" :

En plus, tu me l'as déjà dit il y a quelques jours sur une autre question.
Mais je m'entête dans mes mauvaises habitudes...


Essaie d'imaginer tous les cas où le delete[] peut ne pas être appelé,
et je suis sûr que tu seras vite convaincu d'éviter new char[].

Avatar
Marc G
Je connais exactement la structure du fichier.
Quand je lis une grosse structure (avec de nombreux appels à read),
je trouve lourd de vérifier le nombre d'octects lus à chaque fois.

Qu'est-ce qui se passe dans le code suivant si la lecture de x échoue ?
y-a-t-il une exception lors de la tentative de lecture de y, ou la fonction
ne fait simplement rien compte tenu de l'état du flux ?

input.read((char*)&x,sizeof(x));
input.read((char*)&y,sizeof(y));

je préfèrerait vérifier l'état du flux une fois pour toutes à la fin
(sachant que normalement il n'y a jamais de problème !)

autre question :

operator !() est surchargé pour fstream (entre-autres)
est-ce que operator bool() est surchargé de la même manière (mon compilateur
l'accepte) , ie
if (input) ...
équivaut à
if (!!input)
?
merci
Marc
Avatar
Marc G
merci,
je vois que je ne suis pas le seul lève-tôt :-)
1 2 3