OVH Cloud OVH Cloud

Le problème de l'ANTISLASH

18 réponses
Avatar
david
salut

voila mon probleme :

je suis en train de développer un ptit programme (rudimentaire) de
compression de données. Je l'ai d'abord ecrit sous ouindoz et
aujourd'hui, je l'ai porté sous ... LINUX (ouais, yeepeee !!)

...MAIS... BIG problem...

TOUT marche sauf un truc : à moment donné, j'ai besoin de remplacer tous
les caractères \ avec la chaine \\.

sous ouinedo, evidement ça marche...

pas sous linux. Or la compilation se passe bien... tout se passe tres
bien... sauf evidement que la recherche du caractere \ ne donne
strictement rien.

dans le détail, voila GROSSO MODO comment je procede:
(je ne remplace pas ici un cara par une chaine, mais le pbm est
EXACTEMENT le meme)

// ------------------------------------------------
char *buffer=new[_buffer_len_];

int fp=open("mon_fichier",O_RDWR,S_IREAD|S_IWRITE);
read(fp,buffer,_buffer_len_);

for (int i=0; i<_buffer_len_; i++)
{
if (buffer[i]=='\\') buffer[i]='$';
}

write(fp,buffer,_buffer_len_);
close(fp);
delete[] buffer;
// ------------------------------------------------

voila, je n'ai pas remplacé les \ par des \\, les \ par des $.
et ça ne marche pas... aucune occurence de \ n'est trouvée

ALORS ? QUELQU'UN PEUT-IL M'AIDER ??

PLEASE ?

10 réponses

1 2
Avatar
Éric Lévénez
Le 1/11/03 23:28, dans , « david »
a écrit :

// ------------------------------------------------
char *buffer=new[_buffer_len_];

int fp=open("mon_fichier",O_RDWR,S_IREAD|S_IWRITE);


Et que dit "fp" ? Il est bon ?

read(fp,buffer,_buffer_len_);


Et que dit le "read" ? Une erreur ? Une valeur plus petite retournée ?

for (int i=0; i<_buffer_len_; i++)
{
if (buffer[i]=='') buffer[i]='$';
}

write(fp,buffer,_buffer_len_);


Et que dit le "write" ? Une erreur ? Et si le read a lu moins de données ?

close(fp);


Et que dit le close ? Une erreur ?

delete[] buffer;
// ------------------------------------------------

voila, je n'ai pas remplacé les par des , les par des $.
et ça ne marche pas... aucune occurence de n'est trouvée


Teste les codes de retour et poste un code compilable.

--
Éric Lévénez -- <http://www.levenez.com/>
Unix is not only an OS, it's a way of life.

Avatar
david
Éric Lévénez wrote:
Le 1/11/03 23:28, dans , « david »


// ------------------------------------------------
char *buffer=new[_buffer_len_];

int fp=open("mon_fichier",O_RDWR,S_IREAD|S_IWRITE);



Et que dit "fp" ? Il est bon ?



oui !


read(fp,buffer,_buffer_len_);



Et que dit le "read" ? Une erreur ? Une valeur plus petite retournée ?



non, chef, pas d'erreur, chef


for (int i=0; i<_buffer_len_; i++)
{
if (buffer[i]=='') buffer[i]='$';
}

write(fp,buffer,_buffer_len_);



Et que dit le "write" ? Une erreur ? Et si le read a lu moins de données ?



non plus... sniff. pas la moindre erreur.


close(fp);



Et que dit le close ? Une erreur ?


enfin NON !



delete[] buffer;
// ------------------------------------------------

voila, je n'ai pas remplacé les par des , les par des $.
et ça ne marche pas... aucune occurence de n'est trouvée



Teste les codes de retour et poste un code compilable.



il n'est pas compilable ce code ?
allons, un peu de sérieux!


tu rajoutes


// -------------------------
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>


int main(int argc, char *argv[])
{
// -------------------------------
au début

et

// ----------------
return 0;
}
// --------------------
à la fin...


... Mais si tu ne sais pas faire ça, je doute que tu puisses repondre à
ma question.




juste un petit detail, pour creer le fichier si necessaire :

int fp=open("mon_fichier",O_RDWR|O_CREAT,...

j'avais oublié le O_CREAT dans mon exemple


Avatar
Éric Lévénez
Le 1/11/03 23:49, dans , « david »
a écrit :

Éric Lévénez wrote:
Le 1/11/03 23:28, dans , « david »


// ------------------------------------------------
char *buffer=new[_buffer_len_];

int fp=open("mon_fichier",O_RDWR,S_IREAD|S_IWRITE);


Et que dit "fp" ? Il est bon ?


oui !


Alors où est le test ?

read(fp,buffer,_buffer_len_);



Et que dit le "read" ? Une erreur ? Une valeur plus petite retournée ?


non, chef, pas d'erreur, chef


Alors où est le test ? Et si la longueur retournée est plus petite ?

for (int i=0; i<_buffer_len_; i++)
{
if (buffer[i]=='') buffer[i]='$';
}

write(fp,buffer,_buffer_len_);


Et que dit le "write" ? Une erreur ? Et si le read a lu moins de données ?


non plus... sniff. pas la moindre erreur.


Alors où est le test ?

close(fp);


Et que dit le close ? Une erreur ?


enfin NON !


Alors où est le test ?

delete[] buffer;
// ------------------------------------------------

voila, je n'ai pas remplacé les par des , les par des $.
et ça ne marche pas... aucune occurence de n'est trouvée


Teste les codes de retour et poste un code compilable.


il n'est pas compilable ce code ?


Non, et il est bourré de problèmes plus ou moins graves.

allons, un peu de sérieux!


Ton code est tout sauf sérieux.

tu rajoutes

// -------------------------
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>

int main(int argc, char *argv[])
{
// -------------------------------
au début

et

// ----------------
return 0;
}
// --------------------
à la fin...

... Mais si tu ne sais pas faire ça, je doute que tu puisses repondre à
ma question.


En rajoutant ces bouts de code, ton codene compile pas. Où est défini ta
variable _buffer_len_ ? Comment est-elle initialisée ? Si elle est trop
grande ton programme risque de planter mais en tout cas il écrira des
conneries dans le fichier, et si elle est trop petite, ta boucle ne balayera
pas tout le fichier et tu croiras que les ne sont pas traités...

juste un petit detail, pour creer le fichier si necessaire :

int fp=open("mon_fichier",O_RDWR|O_CREAT,...

j'avais oublié le O_CREAT dans mon exemple


Pourquoi créer un fichier que tu lis ?

Oh là là, je crois que tu as de sérieux problèmes sur le codage. Essaye de
remettre les choses à plat et de coder en testant les codes de retour, et tu
verras qu'en écrivant correctement (avec du code portable qui ne fait aucune
erreur de compile bien sûr mais aussi aucun warning).

J'ai refait ton programme en testant les codes, en écrivant les correctement
la boucle (regarde la doc du read)... et ça marche sans problème sous unix.
Étonnant non.

--
Éric Lévénez -- <http://www.levenez.com/>
Unix is not only an OS, it's a way of life.



Avatar
manu
david wrote:

if (buffer[i]=='') buffer[i]='$';


Pour eviter les histoires de backslashes, j'aurai mis

#define BACKSLASH 0x5c
if (buffer[i] == BACKSLASH) buffer[i]='$';

--
Emmanuel Dreyfus
Publicité subliminale: achetez ce livre!
http://www.eyrolles.com/php.informatique/Ouvrages/9782212112443.php3


Avatar
Pascal Bourguignon
david writes:

salut

voila mon probleme :

je suis en train de développer un ptit programme (rudimentaire) de
compression de données. Je l'ai d'abord ecrit sous ouindoz et
aujourd'hui, je l'ai porté sous ... LINUX (ouais, yeepeee !!)

...MAIS... BIG problem...

TOUT marche sauf un truc : à moment donné, j'ai besoin de remplacer
tous les caractères avec la chaine .

sous ouinedo, evidement ça marche...

pas sous linux. Or la compilation se passe bien... tout se passe tres
bien... sauf evidement que la recherche du caractere ne donne
strictement rien.

dans le détail, voila GROSSO MODO comment je procede:
(je ne remplace pas ici un cara par une chaine, mais le pbm est
EXACTEMENT le meme)

// ------------------------------------------------
char *buffer=new[_buffer_len_];

int fp=open("mon_fichier",O_RDWR,S_IREAD|S_IWRITE);
read(fp,buffer,_buffer_len_);

for (int i=0; i<_buffer_len_; i++)
{
if (buffer[i]=='') buffer[i]='$';
}

write(fp,buffer,_buffer_len_);
close(fp);
delete[] buffer;
// ------------------------------------------------

voila, je n'ai pas remplacé les par des , les par des $.
et ça ne marche pas... aucune occurence de n'est trouvée

ALORS ? QUELQU'UN PEUT-IL M'AIDER ??


Probablement. Il s'appelle man.

man 2 read
man 2 write
man 2 lseek



Par exemple:

{
off_t position_of_data=lseek(fd,0,SEEK_CUR);
size_t read_bytes=read(fd,buffer,sizeof(buffer));
if(read_bytes>0){
size_t written_bytes=0;
int offset=0;
process(buffer,read_bytes);
if(position_of_data!=lseek(fd,position_of_data,SEEK_SET)){
fprintf(stderr,"kseek error %dn",errno);
exit(1);
}
do{
written_chunk=write(fd,buffer+offset,read_bytes-offset);
if(written_chunk>0){
written_bytes+=written_chunk;
}else if(written_chunk<0){
/* certaines erreurs peuvent ne pas être récupérables,
comme EBADF, mais d'autre si, comme ENOSPC, alors
on peut ne pas vouloir avorter dans tout les cas. */
fprintf(stderr,"write error %dn",errno);
}
}while(written_bytes<read_bytes);
}
}

--
__Pascal_Bourguignon__
http://www.informatimago.com/

Avatar
Stephane Chazelas
2003/11/2, 01:07(+01), Emmanuel Dreyfus:
david wrote:

if (buffer[i]=='') buffer[i]='$';


Pour eviter les histoires de backslashes, j'aurai mis

#define BACKSLASH 0x5c
if (buffer[i] == BACKSLASH) buffer[i]='$';


hmmm, peut-etre plutot:

#define BACKSLASH ((char)0x5c)

non ?

Où est le problème avec '' ?

--
Stéphane ["Stephane.Chazelas" arobase "free.fr"]


Avatar
Stephane Chazelas
2003/11/01, 23:28(+01), david:
[...]
char *buffer=new[_buffer_len_];


C'est quoi, ça ? Pas du C en tout cas.

int fp=open("mon_fichier",O_RDWR,S_IREAD|S_IWRITE);
[...]

write(fp,buffer,_buffer_len_);


Faudrait peut-etre un lseek entre les deux, non, pour revenir au
début, ou alors ouvrir deux fois une en RDONLY l'autre en
WRONLY.

--
Stéphane ["Stephane.Chazelas" arobase "free.fr"]

Avatar
William
poste un code compilable.
il n'est pas compilable ce code ?

allons, un peu de sérieux!
tu rajoutes


il faut dire que c'est TOI qui a problème et non nous.
Cela évite de perdre du temps à chaque fois d'autant plus que tu as des
le code tout fait il ne te suffit plus que de copier/coller ici.

--
William.


Avatar
Éric Lévénez
Le 2/11/03 1:07, dans <1g3rv27.1jyr2302rfboiN%, « Emmanuel
Dreyfus » a écrit :

david wrote:

if (buffer[i]=='') buffer[i]='$';


Pour eviter les histoires de backslashes, j'aurai mis


Il n'y a aucun problème avec le ici.

#define BACKSLASH 0x5c
if (buffer[i] == BACKSLASH) buffer[i]='$';


Ce code n'est pas portable car tu supposes un encodage ASCII, ce qui n'est
pas forcément le cas.

--
Éric Lévénez -- <http://www.levenez.com/>
Unix is not only an OS, it's a way of life.


Avatar
Erwan David
Éric Lévénez écrivait :

Ce code n'est pas portable car tu supposes un encodage ASCII, ce qui n'est
pas forcément le cas.


De toute façopn le code utilise open, read et write qui ne sont pas
portables...

Puisqu'il est limité aux suystèmes POSIX, il faudrait vérifier si
POSIX n'impose pas l'ASCII...

--
Erwan

1 2