OVH Cloud OVH Cloud

transformer un tampon en lignes

56 réponses
Avatar
Benoit Izac
Bonjour,

Je cherche à faire une fonction qui me permette de transformer un tampon
en lignes de façon à traiter ces dernières par la suite.

J'ai un bout de code qui fonctionne :
========================================================================
#include <stdio.h>
#include <stdlib.h>

#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>

#define BS 10
#define LM 100

int get_line(const char *buffer, size_t *bp, size_t bs,
char *line, size_t *lp, size_t ls)
{
while (*bp < bs) {
/* not enough space in line */
if (!(*lp < ls)) {
(*bp)--;
line[(*lp)-1] = 0;
(*lp) = 0;
return -1;
}
/* end of file? */
if (buffer[*bp] == EOF) {
printf("end of file?\n");
line[*lp] = 0;
return 0;
}
/* end of line */
if (buffer[*bp] == '\n') {
line[*lp] = 0;
(*lp) = 0;
(*bp)++;
return 1;
}
line[*lp] = buffer[*bp];
(*lp)++;
(*bp)++;
}
/* end of buffer */
(*bp) = 0;
line[*lp] = 0;
return 0;
}


int main(int argc, char *argv[])
{
int fd;
size_t r;
char buf[BS];
char line[LM];
size_t bp = 0;
size_t lp = 0;

if (argc != 2)
exit(1);

fd = open(argv[1], O_RDONLY);
if (fd < 0)
exit(2);

while((r = read(fd, buf, BS))) {
while (get_line(buf, &bp, r, line, &lp, LM))
printf("%s\n", line);
}

close(fd);
return 0;
}
========================================================================
PS : Désolé pour ceux qui ne sont pas sous Unix, j'ai bien essayé de
faire la même chose avec fread() mais cette dernière ne me renvoie pas
la taille lu, ce qui pose un problème à la dernière lecture où r est la
plupart du temps différent de BS.

Mon choix lorsque la taille de line est trop petite est discutable
(vaut-il mieux tronquer les lignes ?) mais ce n'est pas vraiment ce qui
me pose problème.

Les questions :
* Ce code est-il correct (fonctionne-t-il dans tous les cas) ?
* Est-il possible d'alléger le code (que get_line est moins
d'arguments) en déclarant bp et lp static ?
* Existe-t-il une autre solution (fonction toute faite, autre
algorithme) ?

Merci.
--
Benoit Izac

6 réponses

2 3 4 5 6
Avatar
Gabriel Dos Reis
Samuel DEVULDER writes:

[...]

| C'est pas faux effectivement, ca dépend de la nature des fonction que
| l'on code. Si on écrit un truc de traitement numérique pour dal le TV,
| un décodeur DVB ou un os temps reel on a pas les mêmes soucis a vec le
| C que si on fait des utilitaires portables entre OS et hardware.

tu veux dire qu'on a moins d'exigence en terme de qualité de code ?
Avatar
Gabriel Dos Reis
Samuel DEVULDER writes:

[...]

| Je ne sais pas si dans les écoles on apprends concrètement la f açon de
| *concevoir* et pas simplement coder les logiciels,

De là où je viens oui ; là où j'enseigne oui.

| mais ca ne serait
| pas du luxe (il faut les bons enseignants derrière bien
| entendu). Apprendre à travailler en équipe sur le même log iciel dans
| des versions différentes avec des plan de test, de la gestion de conf
| est aussi un truc important pour le boulot.

Je ne conçois pas qu'il y ait un cursus informatique où les à ©lèves n'ont
jamais l'occasion de travailler sur des projets en équipe, avec des
deadlines et des deliverables.
Avatar
Gabriel Dos Reis
xtof pernod writes:

| Le 01/08/2010 15:27, Gabriel Dos Reis a fait rien qu'à écrire:
| > ( ...)
| >
| > Réponse : voir la phrase précédente.
| >
|
| ? Si tu as plus vague, ne te gênes pas..

Relis le message auquel tu répondais dans sa totalité, avant de te
précipiter sur la touche « reply »
Avatar
Gabriel Dos Reis
xtof pernod writes:

| Mais merci pour ce précieux conseil auquel je n'avais pas pensà ©.

De rien. Pour toi, c'est gratuit.
Avatar
Gabriel Dos Reis
xtof pernod writes:

| Le 02/08/2010 12:38, Gabriel Dos Reis a fait rien qu'à écrire:
| > xtof pernod writes:
| >
| > | Mais merci pour ce précieux conseil auquel je n'avais pas pens é.
| >
| > De rien. Pour toi, c'est gratuit.
| >
|
| Alors c'est trop cher.

Tu as tout compris.
Avatar
Gabriel Dos Reis
xtof pernod writes:

| Le 02/08/2010 20:04, Gabriel Dos Reis a fait rien qu'à écrire:
| > xtof pernod writes:
| >
| > | Le 02/08/2010 12:38, Gabriel Dos Reis a fait rien qu'à écri re:
| > | > xtof pernod writes:
| > | >
| > | > | Mais merci pour ce précieux conseil auquel je n'avais pas p ensé.
| > | >
| > | > De rien. Pour toi, c'est gratuit.
| > | >
| > |
| > | Alors c'est trop cher.
| >
| > Tu as tout compris.
|
| Prouve-le ?

Ce message auquel je réponds.
2 3 4 5 6