IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Linux Discussion :

sprintf et lseek


Sujet :

Linux

  1. #1
    Nouveau Candidat au Club
    Inscrit en
    Novembre 2008
    Messages
    2
    Détails du profil
    Informations forums :
    Inscription : Novembre 2008
    Messages : 2
    Points : 1
    Points
    1
    Par défaut sprintf et lseek
    Bonjour,

    J'ai un problème avec le code suivant, creer_fichier devrait me creer un fichier avec un nb_ligne chacune contenant 3 caracteres suivi de '\n' mais ce n'est pas exactement ce qui se passe et pour l'autre fonction lseek me renvoie -1 et je n'arrive pas à trouver pourquoi.
    Pourriez-vous m'aider à corriger mon code?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    #include <stdio.h>
    #include<stdlib.h>
    #include <sys/types.h>
    #include <unistd.h>
    #include <sys/stat.h>
    #include <fcntl.h>
     
    void creer_fichier(int nb_ligne)
    {
    	int T;
    	int i;
    	int m=0;
    	char buff[4];
    	if(  (T=open("Fichier_test",O_CREAT | O_WRONLY | O_TRUNC , S_IRUSR | S_IWUSR | S_IRGRP | S_IROTH)) == -1)
    	{
    		printf("Erreur\n");
    		exit(EXIT_FAILURE);
    	}
    	if(nb_ligne>1000)
    		printf("La fonction doit etre appele avec un nombre entre 1 et 1000\n");
    	else
    	{
    		while(m<nb_ligne)
    		{ 
                            int ecrit ;
    			sprintf(buff,"%d\n",m);
                            ecrit = write(T, buff, 4*sizeof(char));
    			if (ecrit == -1) 
                            {
    				perror("write");
    			}
     
    			m++;
    		}
    	}
     
    	close(T);
     
    }
     
    void operation_fichier(char* nom, int num,int nb_op)
    {
    	char cmd;
    	int T;
    	char buff[4] ;
    	int i=0;
    	int j=0;
    	if(T=open (nom,O_RDWR ) == -1)
    		{
    			printf("Erreur\n");
    			exit(EXIT_FAILURE);
    		}
    	while(i<nb_op)
    	{
    		printf("Tapez r pour lire une ligne ou w pour ecrire : \n");
    		scanf("%c",&cmd);
    		if(cmd=='r')
    		{
    			lseek(T,(num-1)*4,SEEK_SET);
    			read(T,buff,4);
    			for(j=0;j<4;j++)
    			{
    				printf ("%c",buff[j]);
    			}
    		}
    		if(cmd=='w')
    		{
    			char saisie;
    			lseek(T,(num-1)*4,SEEK_SET);
    			printf("Tapez 3 caracteres :\n");
    			scanf("%3c",&saisie);
    			sprintf(buff,"%3c\n",saisie);
    			write(T,buff,4*sizeof(char));
    		}
    		else
    		{
    			printf("Erreur, entrez soit r soit w :\n");
    			operation_fichier(nom,num, nb_op);
    		}
    	}
    	close(T);
    }
     
     
     
    int main(int argc, char** argv)
    {
    	creer_fichier(100);
    	operation_fichier("Fichier_test", 10,3);
    	return EXIT_SUCCESS;
    }

  2. #2
    Membre éclairé
    Avatar de D[r]eadLock
    Profil pro
    Inscrit en
    Mai 2002
    Messages
    504
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : France

    Informations forums :
    Inscription : Mai 2002
    Messages : 504
    Points : 750
    Points
    750
    Par défaut
    Citation Envoyé par aazzaa Voir le message
    J'ai un problème avec le code suivant, creer_fichier devrait me creer un fichier avec un nb_ligne chacune contenant 3 caracteres suivi de '\n' mais ce n'est pas exactement ce qui se passe
    Et que se passe-t-il ?
    Je ne vois pas comment il y aurait 3 caractères exactement (par exemple les nombres <100 n'en ont que 1 ou deux et 1000 en a 4).
    Tu peux soit faire %03d ou utiliser le retour de sprintf pour savoir combien de caractères on été écrit. (et pour le 1000 c'est >=, pas >).

    et pour l'autre fonction lseek me renvoie -1 et je n'arrive pas à trouver pourquoi.
    Et tu ne testes pas dans ton code ? Quand on compile avec -Wall on a des warnings (ça devrait répondre à ta question)

  3. #3
    Nouveau Candidat au Club
    Inscrit en
    Novembre 2008
    Messages
    2
    Détails du profil
    Informations forums :
    Inscription : Novembre 2008
    Messages : 2
    Points : 1
    Points
    1
    Par défaut
    Merci d'avoir répondu.

    D'abord pour 1000 ça ne fait pas partie des données (000 à 999 d'où le 1000 lignes maximum).

    Ensuite j'ai déjà tenté avec le %3d, ça n'écrit même pas dans le fichier et ce n'est que en enlevant le 3 que j'ai un début de résultat (incorrect mais un fichier qui se remplit), aurait tu une autre solution à me proposer?

    Je précise que je suis débutant et que j'ai longuement recherché des réponses à mes questions avant de poster sur un forum.

  4. #4
    Expert éminent sénior
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 689
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 689
    Points : 30 983
    Points
    30 983
    Billets dans le blog
    1
    Par défaut
    Bon, déjà si tu affichais buff avant de l'écrire dans ton fichier, tu aurais une première idée de ce qui est écrit. Par ailleurs, si le chiffre m ne fait qu'un seul caractère (style "2"), ta variable "buff" contient "2<return>" mais tu iras quand-même écrire 4 octets dans ton fichier. Tu aurais mieux fait d'écrire strlen(buff) + 1 octets plutôt que 4 octets brut de pomme. A la limite, en mettant "%03d" t'auras des zéros qui complèteront pour que ton chiffre fasse toujours 3 digits.

    C'est à peu près tout. Peut-être remplacer open par fopen ce qui te permettra d'utiliser directement fprintf. Et éviter de faire exit() dans une fonction, c'est sale. Si la fonction rate, elle renvoie le problème à l'appelant qui lui, soit sait gérer, soit renvoie lui-aussi à l'appekant etc etc jusqu'au main() qui prendra seul la décision de quitter le programme.
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

  5. #5
    Membre éclairé
    Avatar de D[r]eadLock
    Profil pro
    Inscrit en
    Mai 2002
    Messages
    504
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : France

    Informations forums :
    Inscription : Mai 2002
    Messages : 504
    Points : 750
    Points
    750
    Par défaut
    Citation Envoyé par aazzaa Voir le message
    Merci d'avoir répondu.
    D'abord pour 1000 ça ne fait pas partie des données (000 à 999 d'où le 1000 lignes maximum).
    Exact, j'ai lu trop vite le code (le test est bien m<nb_ligne)).

    Citation Envoyé par aazzaa
    Ensuite j'ai déjà tenté avec le %3d, ça n'écrit même pas dans le fichier
    Il devrait afficher les nombres avec des blancs avant pour faire trois caractères exactement (et avec %03d il devrait mettre des 0 devant). Ton problème vient que tu copie 4 caractères alors que tu n'en mets que 2 dans ton buffer. Par exemple pour m=0 tu mets 0\n (et sprintf ajoute \0) et après il y a n'importe quoi, donc soit tu mets toujours 3 chiffres et le \n et tu peux écrire (write) copier 4 caractères soit tu n'écris que le(s) chiffre(s) et le \n.
    Au passage, ton buffer n'est pas assez grand. Quand tu fais sprintf("%d\n",100), il va y avoir 5 caractères écrits: les 3 chiffres, le \n et le \0 !

Discussions similaires

  1. Connaitre la taille du résultat de sprintf
    Par gege2061 dans le forum C
    Réponses: 6
    Dernier message: 09/01/2006, 14h56
  2. [Débutant(e)] equivalence de sprintf en JAVA
    Par GuillaumeCorbineau dans le forum API standards et tierces
    Réponses: 4
    Dernier message: 06/09/2005, 19h18
  3. [débutant] equivalent à sprintf pour les std::string
    Par Biosox dans le forum SL & STL
    Réponses: 22
    Dernier message: 26/08/2005, 12h46
  4. pb sprintf
    Par peuf23 dans le forum Langage
    Réponses: 4
    Dernier message: 02/08/2005, 17h46
  5. sprintf : le point devient virgule ?!
    Par jula dans le forum C++
    Réponses: 4
    Dernier message: 17/09/2004, 12h50

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo