Conclusions :
* les lignes avec juste un 'n' sont supprimées
Euh, oui, normal.. pas de token entre 2 délimiteurs de suite.
Pour mon usage, ce n'est pas gênant, mais il faut être conscient que
ce n'est pas une solution universelle.
? ben.. Ca fait bien ce que ça dit. Et en toute logique, plusieurs
délimiteurs de suite n'encadrent aucun "token", et donc ça ne retourne
rien.
Essaye autre chose si ça te convient pas..
* si len (la taille de buff) est trop petite pour avoir une ligne
entière, la ligne est coupée
Là, je dirais que c'est à toi de prévoir suffisamment grand.
Je pense qu'il y a moyen de faire ça avec archive_entry_size() pour
avoir sa taille, d'allouer puis de faire le archive_read_data(). Mais
bon, ça veut dire mettre un fichier entier en mémoire à chaque fois.
Je vais quand même tester pour voir.
Comme tu veux, mais àma tu te compliques la vie.
Donc, soit je ne sais pas l'utiliser, soit ça ne me convient pas.
Tout n'est pas perdu: dans "SEE ALSO", il cite strchr et index
(entre autres) mais celles ci devraient faire ton bonheur.
Ce serait plutôt memchr() dans mon cas mais je ne vois pas ce que ça
Implicitement, "lignes" + 'n' veut dire que tu traines des chaines de
caractères imprimables (surtout que tu les sorts au printf()); mem*(),
c'est pour des données quelconques et/ou binaires. A toi de voir.change par rapport au parcourt du buffer que je faisais précédemment.
Euh, quel parcours, de quelle version ?!
Dans tous les cas, memchr(), va parcourir la chaîne, puis memcpy() va
le faire aussi.
Certes, mais là tu t'embêtes avec des points de détail. Combien de
temps cpu, pour scruter quelques dizaines d'octets ?
Conclusions :
* les lignes avec juste un 'n' sont supprimées
Euh, oui, normal.. pas de token entre 2 délimiteurs de suite.
Pour mon usage, ce n'est pas gênant, mais il faut être conscient que
ce n'est pas une solution universelle.
? ben.. Ca fait bien ce que ça dit. Et en toute logique, plusieurs
délimiteurs de suite n'encadrent aucun "token", et donc ça ne retourne
rien.
Essaye autre chose si ça te convient pas..
* si len (la taille de buff) est trop petite pour avoir une ligne
entière, la ligne est coupée
Là, je dirais que c'est à toi de prévoir suffisamment grand.
Je pense qu'il y a moyen de faire ça avec archive_entry_size() pour
avoir sa taille, d'allouer puis de faire le archive_read_data(). Mais
bon, ça veut dire mettre un fichier entier en mémoire à chaque fois.
Je vais quand même tester pour voir.
Comme tu veux, mais àma tu te compliques la vie.
Donc, soit je ne sais pas l'utiliser, soit ça ne me convient pas.
Tout n'est pas perdu: dans "SEE ALSO", il cite strchr et index
(entre autres) mais celles ci devraient faire ton bonheur.
Ce serait plutôt memchr() dans mon cas mais je ne vois pas ce que ça
Implicitement, "lignes" + 'n' veut dire que tu traines des chaines de
caractères imprimables (surtout que tu les sorts au printf()); mem*(),
c'est pour des données quelconques et/ou binaires. A toi de voir.
change par rapport au parcourt du buffer que je faisais précédemment.
Euh, quel parcours, de quelle version ?!
Dans tous les cas, memchr(), va parcourir la chaîne, puis memcpy() va
le faire aussi.
Certes, mais là tu t'embêtes avec des points de détail. Combien de
temps cpu, pour scruter quelques dizaines d'octets ?
Conclusions :
* les lignes avec juste un 'n' sont supprimées
Euh, oui, normal.. pas de token entre 2 délimiteurs de suite.
Pour mon usage, ce n'est pas gênant, mais il faut être conscient que
ce n'est pas une solution universelle.
? ben.. Ca fait bien ce que ça dit. Et en toute logique, plusieurs
délimiteurs de suite n'encadrent aucun "token", et donc ça ne retourne
rien.
Essaye autre chose si ça te convient pas..
* si len (la taille de buff) est trop petite pour avoir une ligne
entière, la ligne est coupée
Là, je dirais que c'est à toi de prévoir suffisamment grand.
Je pense qu'il y a moyen de faire ça avec archive_entry_size() pour
avoir sa taille, d'allouer puis de faire le archive_read_data(). Mais
bon, ça veut dire mettre un fichier entier en mémoire à chaque fois.
Je vais quand même tester pour voir.
Comme tu veux, mais àma tu te compliques la vie.
Donc, soit je ne sais pas l'utiliser, soit ça ne me convient pas.
Tout n'est pas perdu: dans "SEE ALSO", il cite strchr et index
(entre autres) mais celles ci devraient faire ton bonheur.
Ce serait plutôt memchr() dans mon cas mais je ne vois pas ce que ça
Implicitement, "lignes" + 'n' veut dire que tu traines des chaines de
caractères imprimables (surtout que tu les sorts au printf()); mem*(),
c'est pour des données quelconques et/ou binaires. A toi de voir.change par rapport au parcourt du buffer que je faisais précédemment.
Euh, quel parcours, de quelle version ?!
Dans tous les cas, memchr(), va parcourir la chaîne, puis memcpy() va
le faire aussi.
Certes, mais là tu t'embêtes avec des points de détail. Combien de
temps cpu, pour scruter quelques dizaines d'octets ?
In article <4c533f6e$0$10196$,
xtof pernod wrote:Pour S_IRUSR, S_IWUSR & S_IXUSR etc. dans le cas où open(), avec O_CREAT,
a besoin du 3eme parametre (mode).
Sauf qu'en général on met 0640, et stat.h ne sert pas..
0640 ? Ah non, 0666 le plus souvent. umask(2), c'est pas fait pour les
chiens...
In article <4c533f6e$0$10196$ba4acef3@reader.news.orange.fr>,
xtof pernod <xtof.pernod@N0SPAM.free.fr> wrote:
Pour S_IRUSR, S_IWUSR & S_IXUSR etc. dans le cas où open(), avec O_CREAT,
a besoin du 3eme parametre (mode).
Sauf qu'en général on met 0640, et stat.h ne sert pas..
0640 ? Ah non, 0666 le plus souvent. umask(2), c'est pas fait pour les
chiens...
In article <4c533f6e$0$10196$,
xtof pernod wrote:Pour S_IRUSR, S_IWUSR & S_IXUSR etc. dans le cas où open(), avec O_CREAT,
a besoin du 3eme parametre (mode).
Sauf qu'en général on met 0640, et stat.h ne sert pas..
0640 ? Ah non, 0666 le plus souvent. umask(2), c'est pas fait pour les
chiens...
Bonjour,
le 30/07/2010 à 23:13, xtof pernod a écrit dans le message
<4c534065$0$10201$ :Conclusions :
* les lignes avec juste un 'n' sont supprimées
Euh, oui, normal.. pas de token entre 2 délimiteurs de suite.
Pour mon usage, ce n'est pas gênant, mais il faut être conscient que
ce n'est pas une solution universelle.
? ben.. Ca fait bien ce que ça dit. Et en toute logique, plusieurs
délimiteurs de suite n'encadrent aucun "token", et donc ça ne retourne
rien.
Non. Les exemples que j'ai posté te permette de faire :
$ gcc a.c && ./a.out a.c > b.c && diff a.c b.c && echo OK
OK
Il n'y a pas de modification de ce qui est lu dans le buffer.Essaye autre chose si ça te convient pas..
C'est ce que je fais depuis un petit moment.
* si len (la taille de buff) est trop petite pour avoir une ligne
entière, la ligne est coupée
Là, je dirais que c'est à toi de prévoir suffisamment grand.
Je pense qu'il y a moyen de faire ça avec archive_entry_size() pour
avoir sa taille, d'allouer puis de faire le archive_read_data(). Mais
bon, ça veut dire mettre un fichier entier en mémoire à chaque fois.
Je vais quand même tester pour voir.
Comme tu veux, mais àma tu te compliques la vie.
Comment faire autrement puisque si mon buffer est trop petit, les
résultats sont faux ?
Donc, soit je ne sais pas l'utiliser, soit ça ne me convient pas.
Tout n'est pas perdu: dans "SEE ALSO", il cite strchr et index
(entre autres) mais celles ci devraient faire ton bonheur.
Ce serait plutôt memchr() dans mon cas mais je ne vois pas ce que ça
Implicitement, "lignes" + 'n' veut dire que tu traines des chaines de
caractères imprimables (surtout que tu les sorts au printf()); mem*(),
c'est pour des données quelconques et/ou binaires. A toi de voir.change par rapport au parcourt du buffer que je faisais précédemment.
Euh, quel parcours, de quelle version ?!
<news:
<http://groups.google.fr/group/fr.comp.lang.c/msg/e8dfd7106fb7869a>
<news:
<http://groups.google.fr/group/fr.comp.lang.c/msg/6c93f613b851a4ac>Dans tous les cas, memchr(), va parcourir la chaîne, puis memcpy() va
le faire aussi.
Certes, mais là tu t'embêtes avec des points de détail. Combien de
temps cpu, pour scruter quelques dizaines d'octets ?
Il s'agit de 80 Mo de données, ce n'est pas négligeable.
Bonjour,
le 30/07/2010 à 23:13, xtof pernod a écrit dans le message
<4c534065$0$10201$ba4acef3@reader.news.orange.fr> :
Conclusions :
* les lignes avec juste un 'n' sont supprimées
Euh, oui, normal.. pas de token entre 2 délimiteurs de suite.
Pour mon usage, ce n'est pas gênant, mais il faut être conscient que
ce n'est pas une solution universelle.
? ben.. Ca fait bien ce que ça dit. Et en toute logique, plusieurs
délimiteurs de suite n'encadrent aucun "token", et donc ça ne retourne
rien.
Non. Les exemples que j'ai posté te permette de faire :
$ gcc a.c && ./a.out a.c > b.c && diff a.c b.c && echo OK
OK
Il n'y a pas de modification de ce qui est lu dans le buffer.
Essaye autre chose si ça te convient pas..
C'est ce que je fais depuis un petit moment.
* si len (la taille de buff) est trop petite pour avoir une ligne
entière, la ligne est coupée
Là, je dirais que c'est à toi de prévoir suffisamment grand.
Je pense qu'il y a moyen de faire ça avec archive_entry_size() pour
avoir sa taille, d'allouer puis de faire le archive_read_data(). Mais
bon, ça veut dire mettre un fichier entier en mémoire à chaque fois.
Je vais quand même tester pour voir.
Comme tu veux, mais àma tu te compliques la vie.
Comment faire autrement puisque si mon buffer est trop petit, les
résultats sont faux ?
Donc, soit je ne sais pas l'utiliser, soit ça ne me convient pas.
Tout n'est pas perdu: dans "SEE ALSO", il cite strchr et index
(entre autres) mais celles ci devraient faire ton bonheur.
Ce serait plutôt memchr() dans mon cas mais je ne vois pas ce que ça
Implicitement, "lignes" + 'n' veut dire que tu traines des chaines de
caractères imprimables (surtout que tu les sorts au printf()); mem*(),
c'est pour des données quelconques et/ou binaires. A toi de voir.
change par rapport au parcourt du buffer que je faisais précédemment.
Euh, quel parcours, de quelle version ?!
<news:w53bp9p7715.fsf@izac.org>
<http://groups.google.fr/group/fr.comp.lang.c/msg/e8dfd7106fb7869a>
<news:w534ofg7whg.fsf@izac.org>
<http://groups.google.fr/group/fr.comp.lang.c/msg/6c93f613b851a4ac>
Dans tous les cas, memchr(), va parcourir la chaîne, puis memcpy() va
le faire aussi.
Certes, mais là tu t'embêtes avec des points de détail. Combien de
temps cpu, pour scruter quelques dizaines d'octets ?
Il s'agit de 80 Mo de données, ce n'est pas négligeable.
Bonjour,
le 30/07/2010 à 23:13, xtof pernod a écrit dans le message
<4c534065$0$10201$ :Conclusions :
* les lignes avec juste un 'n' sont supprimées
Euh, oui, normal.. pas de token entre 2 délimiteurs de suite.
Pour mon usage, ce n'est pas gênant, mais il faut être conscient que
ce n'est pas une solution universelle.
? ben.. Ca fait bien ce que ça dit. Et en toute logique, plusieurs
délimiteurs de suite n'encadrent aucun "token", et donc ça ne retourne
rien.
Non. Les exemples que j'ai posté te permette de faire :
$ gcc a.c && ./a.out a.c > b.c && diff a.c b.c && echo OK
OK
Il n'y a pas de modification de ce qui est lu dans le buffer.Essaye autre chose si ça te convient pas..
C'est ce que je fais depuis un petit moment.
* si len (la taille de buff) est trop petite pour avoir une ligne
entière, la ligne est coupée
Là, je dirais que c'est à toi de prévoir suffisamment grand.
Je pense qu'il y a moyen de faire ça avec archive_entry_size() pour
avoir sa taille, d'allouer puis de faire le archive_read_data(). Mais
bon, ça veut dire mettre un fichier entier en mémoire à chaque fois.
Je vais quand même tester pour voir.
Comme tu veux, mais àma tu te compliques la vie.
Comment faire autrement puisque si mon buffer est trop petit, les
résultats sont faux ?
Donc, soit je ne sais pas l'utiliser, soit ça ne me convient pas.
Tout n'est pas perdu: dans "SEE ALSO", il cite strchr et index
(entre autres) mais celles ci devraient faire ton bonheur.
Ce serait plutôt memchr() dans mon cas mais je ne vois pas ce que ça
Implicitement, "lignes" + 'n' veut dire que tu traines des chaines de
caractères imprimables (surtout que tu les sorts au printf()); mem*(),
c'est pour des données quelconques et/ou binaires. A toi de voir.change par rapport au parcourt du buffer que je faisais précédemment.
Euh, quel parcours, de quelle version ?!
<news:
<http://groups.google.fr/group/fr.comp.lang.c/msg/e8dfd7106fb7869a>
<news:
<http://groups.google.fr/group/fr.comp.lang.c/msg/6c93f613b851a4ac>Dans tous les cas, memchr(), va parcourir la chaîne, puis memcpy() va
le faire aussi.
Certes, mais là tu t'embêtes avec des points de détail. Combien de
temps cpu, pour scruter quelques dizaines d'octets ?
Il s'agit de 80 Mo de données, ce n'est pas négligeable.
Le 30/07/2010 23:22, Marc Espie a fait rien qu'à écrire:In article <4c533f6e$0$10196$,
xtof pernod wrote:Pour S_IRUSR, S_IWUSR & S_IXUSR etc. dans le cas où open(), avec O_CREAT,
a besoin du 3eme parametre (mode).
Sauf qu'en général on met 0640, et stat.h ne sert pas..
0640 ? Ah non, 0666 le plus souvent. umask(2), c'est pas fait pour les
chiens...
WaF ? Tu mets un umask(2) partout où tu utilises open() ?
J'ai juste umask 066 dans le .profile de root, le reste...
Le 30/07/2010 23:22, Marc Espie a fait rien qu'à écrire:
In article <4c533f6e$0$10196$ba4acef3@reader.news.orange.fr>,
xtof pernod <xtof.pernod@N0SPAM.free.fr> wrote:
Pour S_IRUSR, S_IWUSR & S_IXUSR etc. dans le cas où open(), avec O_CREAT,
a besoin du 3eme parametre (mode).
Sauf qu'en général on met 0640, et stat.h ne sert pas..
0640 ? Ah non, 0666 le plus souvent. umask(2), c'est pas fait pour les
chiens...
WaF ? Tu mets un umask(2) partout où tu utilises open() ?
J'ai juste umask 066 dans le .profile de root, le reste...
Le 30/07/2010 23:22, Marc Espie a fait rien qu'à écrire:In article <4c533f6e$0$10196$,
xtof pernod wrote:Pour S_IRUSR, S_IWUSR & S_IXUSR etc. dans le cas où open(), avec O_CREAT,
a besoin du 3eme parametre (mode).
Sauf qu'en général on met 0640, et stat.h ne sert pas..
0640 ? Ah non, 0666 le plus souvent. umask(2), c'est pas fait pour les
chiens...
WaF ? Tu mets un umask(2) partout où tu utilises open() ?
J'ai juste umask 066 dans le .profile de root, le reste...
Je vois bien. Le pb a pourtant pas l'air compliqué, je pense que 10 lignes
de codes devraient suffire, à moins que j'ai loupé un truc.
Faut dire aussi que les infos arrivent un peu au compte-goutte..
0 = taille de la ligne ? taille des données restant dans le buffer ?Comment faire autrement puisque si mon buffer est trop petit, les
résultats sont faux ?
Le dimensionner suffisament grand ? Excuse moi, mais ma boule de
cristal ne m'a pas révélé à quoi ressemblait tes données.
Je suppose toujours que c'est des chaines, vu que tu emploies printf().
Fais déja un bon programme avant de te soucier des fonctions de la
bib' standard du C. Elles ont été optimisées au max., le compilateur
(gcc et d'autres) fait un bon boulot surtout pour mem*().
Je vois bien. Le pb a pourtant pas l'air compliqué, je pense que 10 lignes
de codes devraient suffire, à moins que j'ai loupé un truc.
Faut dire aussi que les infos arrivent un peu au compte-goutte..
0 = taille de la ligne ? taille des données restant dans le buffer ?
Comment faire autrement puisque si mon buffer est trop petit, les
résultats sont faux ?
Le dimensionner suffisament grand ? Excuse moi, mais ma boule de
cristal ne m'a pas révélé à quoi ressemblait tes données.
Je suppose toujours que c'est des chaines, vu que tu emploies printf().
Fais déja un bon programme avant de te soucier des fonctions de la
bib' standard du C. Elles ont été optimisées au max., le compilateur
(gcc et d'autres) fait un bon boulot surtout pour mem*().
Je vois bien. Le pb a pourtant pas l'air compliqué, je pense que 10 lignes
de codes devraient suffire, à moins que j'ai loupé un truc.
Faut dire aussi que les infos arrivent un peu au compte-goutte..
0 = taille de la ligne ? taille des données restant dans le buffer ?Comment faire autrement puisque si mon buffer est trop petit, les
résultats sont faux ?
Le dimensionner suffisament grand ? Excuse moi, mais ma boule de
cristal ne m'a pas révélé à quoi ressemblait tes données.
Je suppose toujours que c'est des chaines, vu que tu emploies printf().
Fais déja un bon programme avant de te soucier des fonctions de la
bib' standard du C. Elles ont été optimisées au max., le compilateur
(gcc et d'autres) fait un bon boulot surtout pour mem*().
Avec ça, ton prototype initial :
extern void plot(int color, int y, int x);
...n'est qu'une vulgaire blague pour n'importe qui a déjà mis les pieds
dans une bibliothèque graphique.
Toutes celles que je connais ont la
Si tu as vu y,x ailleurs, dis-moi où que je
l'évite à tout prix.
...mais me plaît beaucoup moins que :
color(3);
plot(12, 128);
Avec ça, ton prototype initial :
extern void plot(int color, int y, int x);
...n'est qu'une vulgaire blague pour n'importe qui a déjà mis les pieds
dans une bibliothèque graphique.
Toutes celles que je connais ont la
Si tu as vu y,x ailleurs, dis-moi où que je
l'évite à tout prix.
...mais me plaît beaucoup moins que :
color(3);
plot(12, 128);
Avec ça, ton prototype initial :
extern void plot(int color, int y, int x);
...n'est qu'une vulgaire blague pour n'importe qui a déjà mis les pieds
dans une bibliothèque graphique.
Toutes celles que je connais ont la
Si tu as vu y,x ailleurs, dis-moi où que je
l'évite à tout prix.
...mais me plaît beaucoup moins que :
color(3);
plot(12, 128);
In article <4c5348fd$0$10197$,
xtof pernod wrote:Le 30/07/2010 23:22, Marc Espie a fait rien qu'à écrire:In article <4c533f6e$0$10196$,
xtof pernod wrote:Pour S_IRUSR, S_IWUSR & S_IXUSR etc. dans le cas où open(), avec O_CREAT,
a besoin du 3eme parametre (mode).
Sauf qu'en général on met 0640, et stat.h ne sert pas..
0640 ? Ah non, 0666 le plus souvent. umask(2), c'est pas fait pour les
chiens...WaF ? Tu mets un umask(2) partout où tu utilises open() ?
J'ai juste umask 066 dans le .profile de root, le reste...
Non, mais je cree mes fichiers avec open(..., 0666) sauf raison specifique
(par exemple, fichier qui *doit* etre prive. Typiquement, une application
qui sauve des mails avec autre chose que 0600 est un peu buggue).
C'est pas a l'appli d'etre parano,
mais a l'utilisateur. Un utilisateur
normal aura 022 comme umask. S'il a autre chose, c'est son probleme, et
c'est pas a ton programme de decider a sa place !
In article <4c5348fd$0$10197$ba4acef3@reader.news.orange.fr>,
xtof pernod <xtof.pernod@N0SPAM.free.fr> wrote:
Le 30/07/2010 23:22, Marc Espie a fait rien qu'à écrire:
In article <4c533f6e$0$10196$ba4acef3@reader.news.orange.fr>,
xtof pernod <xtof.pernod@N0SPAM.free.fr> wrote:
Pour S_IRUSR, S_IWUSR & S_IXUSR etc. dans le cas où open(), avec O_CREAT,
a besoin du 3eme parametre (mode).
Sauf qu'en général on met 0640, et stat.h ne sert pas..
0640 ? Ah non, 0666 le plus souvent. umask(2), c'est pas fait pour les
chiens...
WaF ? Tu mets un umask(2) partout où tu utilises open() ?
J'ai juste umask 066 dans le .profile de root, le reste...
Non, mais je cree mes fichiers avec open(..., 0666) sauf raison specifique
(par exemple, fichier qui *doit* etre prive. Typiquement, une application
qui sauve des mails avec autre chose que 0600 est un peu buggue).
C'est pas a l'appli d'etre parano,
mais a l'utilisateur. Un utilisateur
normal aura 022 comme umask. S'il a autre chose, c'est son probleme, et
c'est pas a ton programme de decider a sa place !
In article <4c5348fd$0$10197$,
xtof pernod wrote:Le 30/07/2010 23:22, Marc Espie a fait rien qu'à écrire:In article <4c533f6e$0$10196$,
xtof pernod wrote:Pour S_IRUSR, S_IWUSR & S_IXUSR etc. dans le cas où open(), avec O_CREAT,
a besoin du 3eme parametre (mode).
Sauf qu'en général on met 0640, et stat.h ne sert pas..
0640 ? Ah non, 0666 le plus souvent. umask(2), c'est pas fait pour les
chiens...WaF ? Tu mets un umask(2) partout où tu utilises open() ?
J'ai juste umask 066 dans le .profile de root, le reste...
Non, mais je cree mes fichiers avec open(..., 0666) sauf raison specifique
(par exemple, fichier qui *doit* etre prive. Typiquement, une application
qui sauve des mails avec autre chose que 0600 est un peu buggue).
C'est pas a l'appli d'etre parano,
mais a l'utilisateur. Un utilisateur
normal aura 022 comme umask. S'il a autre chose, c'est son probleme, et
c'est pas a ton programme de decider a sa place !
le 31/07/2010 à 00:19, xtof pernod a écrit dans le message
<4c535001$0$10191$ :(...)
Faut dire aussi que les infos arrivent un peu au compte-goutte..
Faut pas exagérer non plus. Je reconnais que je me suis viandé avec
fread(), ce qui a provoqué plus de réponses concernant read/open que sur
le problème en lui-même. Maintenant, l'objet du message me parait plutôt
explicite : « transformer un tampon en lignes ».
Concernant la solution au programme qui utilise la libarchive, je l'ai
trouvée avant de poster ce message. Ce qui m'ennuie c'est que le code
ressemble à ça :
(snip)
J'ai une indentation de 4 espaces,
si j'en avais 8, je serais en dehors
de la page.
Je cherche donc à mettre tout ce traitement dans une
fonction de manière à avoir un code plus lisible et donc plus
maintenable.
Tant qu'à faire une fonction, autant qu'elle puisse me resservir pour
plus tard. Je cherche donc à faire un truc générique.
En entrée, au minimum :
* le buffer
* sa taille
* un espace pour stocker la ligne en cours
En sortie :
* NULL si le buffer est vide pour faire une autre lecture des données
ou
-1 = erreur (ligne trop courte par exemple)
0 = buffer vide
>0 = taille de la ligne ? taille des données restant dans le buffer ?
Comment faire autrement puisque si mon buffer est trop petit, les
résultats sont faux ?
Le dimensionner suffisament grand ? Excuse moi, mais ma boule de
cristal ne m'a pas révélé à quoi ressemblait tes données.
Je viens de regarder, le plus grand fichier texte que j'ai à lire fait
5 Mo. Mais encore une fois, je ne peux pas le savoir à l'avance (sauf
avec archive_entry_size()) et peut-être que demain il fera 10 Mo.
Je suppose toujours que c'est des chaines, vu que tu emploies printf().
Ce ne sont que des fichiers texte sur lequel je fais un traitement ligne
par ligne (recherche d'un motif, soit avec strstr() soir avec
regexec() mais ça pourrait être autre chose).
Fais déja un bon programme avant de te soucier des fonctions de la
bib' standard du C. Elles ont été optimisées au max., le compilateur
(gcc et d'autres) fait un bon boulot surtout pour mem*().
Je ne me soucie pas de la bibliothèque standard, mais je constate qu'en
fonction des différentes implémentations que j'ai faites, que les
différences sont significatives : moins de 2 secondes dans le meilleur
des cas, 6 secondes dans le pire des cas. Bon j'ai même été jusqu'à 30
secondes car je faisais les regcomp/regfree dans la boucle alors qu'il
suffit de le faire une fois. Après tout est relatif...
le 31/07/2010 à 00:19, xtof pernod a écrit dans le message
<4c535001$0$10191$ba4acef3@reader.news.orange.fr> :
(...)
Faut dire aussi que les infos arrivent un peu au compte-goutte..
Faut pas exagérer non plus. Je reconnais que je me suis viandé avec
fread(), ce qui a provoqué plus de réponses concernant read/open que sur
le problème en lui-même. Maintenant, l'objet du message me parait plutôt
explicite : « transformer un tampon en lignes ».
Concernant la solution au programme qui utilise la libarchive, je l'ai
trouvée avant de poster ce message. Ce qui m'ennuie c'est que le code
ressemble à ça :
(snip)
J'ai une indentation de 4 espaces,
si j'en avais 8, je serais en dehors
de la page.
Je cherche donc à mettre tout ce traitement dans une
fonction de manière à avoir un code plus lisible et donc plus
maintenable.
Tant qu'à faire une fonction, autant qu'elle puisse me resservir pour
plus tard. Je cherche donc à faire un truc générique.
En entrée, au minimum :
* le buffer
* sa taille
* un espace pour stocker la ligne en cours
En sortie :
* NULL si le buffer est vide pour faire une autre lecture des données
ou
-1 = erreur (ligne trop courte par exemple)
0 = buffer vide
>0 = taille de la ligne ? taille des données restant dans le buffer ?
Comment faire autrement puisque si mon buffer est trop petit, les
résultats sont faux ?
Le dimensionner suffisament grand ? Excuse moi, mais ma boule de
cristal ne m'a pas révélé à quoi ressemblait tes données.
Je viens de regarder, le plus grand fichier texte que j'ai à lire fait
5 Mo. Mais encore une fois, je ne peux pas le savoir à l'avance (sauf
avec archive_entry_size()) et peut-être que demain il fera 10 Mo.
Je suppose toujours que c'est des chaines, vu que tu emploies printf().
Ce ne sont que des fichiers texte sur lequel je fais un traitement ligne
par ligne (recherche d'un motif, soit avec strstr() soir avec
regexec() mais ça pourrait être autre chose).
Fais déja un bon programme avant de te soucier des fonctions de la
bib' standard du C. Elles ont été optimisées au max., le compilateur
(gcc et d'autres) fait un bon boulot surtout pour mem*().
Je ne me soucie pas de la bibliothèque standard, mais je constate qu'en
fonction des différentes implémentations que j'ai faites, que les
différences sont significatives : moins de 2 secondes dans le meilleur
des cas, 6 secondes dans le pire des cas. Bon j'ai même été jusqu'à 30
secondes car je faisais les regcomp/regfree dans la boucle alors qu'il
suffit de le faire une fois. Après tout est relatif...
le 31/07/2010 à 00:19, xtof pernod a écrit dans le message
<4c535001$0$10191$ :(...)
Faut dire aussi que les infos arrivent un peu au compte-goutte..
Faut pas exagérer non plus. Je reconnais que je me suis viandé avec
fread(), ce qui a provoqué plus de réponses concernant read/open que sur
le problème en lui-même. Maintenant, l'objet du message me parait plutôt
explicite : « transformer un tampon en lignes ».
Concernant la solution au programme qui utilise la libarchive, je l'ai
trouvée avant de poster ce message. Ce qui m'ennuie c'est que le code
ressemble à ça :
(snip)
J'ai une indentation de 4 espaces,
si j'en avais 8, je serais en dehors
de la page.
Je cherche donc à mettre tout ce traitement dans une
fonction de manière à avoir un code plus lisible et donc plus
maintenable.
Tant qu'à faire une fonction, autant qu'elle puisse me resservir pour
plus tard. Je cherche donc à faire un truc générique.
En entrée, au minimum :
* le buffer
* sa taille
* un espace pour stocker la ligne en cours
En sortie :
* NULL si le buffer est vide pour faire une autre lecture des données
ou
-1 = erreur (ligne trop courte par exemple)
0 = buffer vide
>0 = taille de la ligne ? taille des données restant dans le buffer ?
Comment faire autrement puisque si mon buffer est trop petit, les
résultats sont faux ?
Le dimensionner suffisament grand ? Excuse moi, mais ma boule de
cristal ne m'a pas révélé à quoi ressemblait tes données.
Je viens de regarder, le plus grand fichier texte que j'ai à lire fait
5 Mo. Mais encore une fois, je ne peux pas le savoir à l'avance (sauf
avec archive_entry_size()) et peut-être que demain il fera 10 Mo.
Je suppose toujours que c'est des chaines, vu que tu emploies printf().
Ce ne sont que des fichiers texte sur lequel je fais un traitement ligne
par ligne (recherche d'un motif, soit avec strstr() soir avec
regexec() mais ça pourrait être autre chose).
Fais déja un bon programme avant de te soucier des fonctions de la
bib' standard du C. Elles ont été optimisées au max., le compilateur
(gcc et d'autres) fait un bon boulot surtout pour mem*().
Je ne me soucie pas de la bibliothèque standard, mais je constate qu'en
fonction des différentes implémentations que j'ai faites, que les
différences sont significatives : moins de 2 secondes dans le meilleur
des cas, 6 secondes dans le pire des cas. Bon j'ai même été jusqu'à 30
secondes car je faisais les regcomp/regfree dans la boucle alors qu'il
suffit de le faire une fois. Après tout est relatif...
Je dirais que c'est au programmeur. L'appli, elle, est programmée pour en
avoir rien à foutre. Ce qu'elle fait avec le plus grand bonheur..mais a l'utilisateur. Un utilisateur
Euh.. Si tu peux parler à tes utilisateurs de perm. en octal ,
pas de doute, c'est de la balle^W^W^W. l'idéal.
Mais c'est plutôt rare dans le cas général...
normal aura 022 comme umask. S'il a autre chose, c'est son probleme, et
c'est pas a ton programme de decider a sa place !
Bon.. On va peut-être pas trétrasectionner pour 022 euroctals, si ?
Ou alors au comptoir. fu2 pré-postionné, il y a plein de gens inspirés.
Je dirais que c'est au programmeur. L'appli, elle, est programmée pour en
avoir rien à foutre. Ce qu'elle fait avec le plus grand bonheur..
mais a l'utilisateur. Un utilisateur
Euh.. Si tu peux parler à tes utilisateurs de perm. en octal ,
pas de doute, c'est de la balle^W^W^W. l'idéal.
Mais c'est plutôt rare dans le cas général...
normal aura 022 comme umask. S'il a autre chose, c'est son probleme, et
c'est pas a ton programme de decider a sa place !
Bon.. On va peut-être pas trétrasectionner pour 022 euroctals, si ?
Ou alors au comptoir. fu2 pré-postionné, il y a plein de gens inspirés.
Je dirais que c'est au programmeur. L'appli, elle, est programmée pour en
avoir rien à foutre. Ce qu'elle fait avec le plus grand bonheur..mais a l'utilisateur. Un utilisateur
Euh.. Si tu peux parler à tes utilisateurs de perm. en octal ,
pas de doute, c'est de la balle^W^W^W. l'idéal.
Mais c'est plutôt rare dans le cas général...
normal aura 022 comme umask. S'il a autre chose, c'est son probleme, et
c'est pas a ton programme de decider a sa place !
Bon.. On va peut-être pas trétrasectionner pour 022 euroctals, si ?
Ou alors au comptoir. fu2 pré-postionné, il y a plein de gens inspirés.
Bonjour,
le 31/07/2010 à 00:19, xtof pernod a écrit dans le message
<4c535001$0$10191$ :Je vois bien. Le pb a pourtant pas l'air compliqué, je pense que 10 lignes
de codes devraient suffire, à moins que j'ai loupé un truc.
Faut dire aussi que les infos arrivent un peu au compte-goutte..
Faut pas exagérer non plus. Je reconnais que je me suis viandé avec
fread(), ce qui a provoqué plus de réponses concernant read/open que sur
le problème en lui-même.
Bonjour,
le 31/07/2010 à 00:19, xtof pernod a écrit dans le message
<4c535001$0$10191$ba4acef3@reader.news.orange.fr> :
Je vois bien. Le pb a pourtant pas l'air compliqué, je pense que 10 lignes
de codes devraient suffire, à moins que j'ai loupé un truc.
Faut dire aussi que les infos arrivent un peu au compte-goutte..
Faut pas exagérer non plus. Je reconnais que je me suis viandé avec
fread(), ce qui a provoqué plus de réponses concernant read/open que sur
le problème en lui-même.
Bonjour,
le 31/07/2010 à 00:19, xtof pernod a écrit dans le message
<4c535001$0$10191$ :Je vois bien. Le pb a pourtant pas l'air compliqué, je pense que 10 lignes
de codes devraient suffire, à moins que j'ai loupé un truc.
Faut dire aussi que les infos arrivent un peu au compte-goutte..
Faut pas exagérer non plus. Je reconnais que je me suis viandé avec
fread(), ce qui a provoqué plus de réponses concernant read/open que sur
le problème en lui-même.