Programme d'ecriture dans un tableur

Fermé
Dredall - Modifié par Dredall le 22/10/2013 à 13:22
[Dal] Messages postés 6198 Date d'inscription mercredi 15 septembre 2004 Statut Contributeur Dernière intervention 13 décembre 2024 - 22 oct. 2013 à 17:31
Bonjour,
Je dois faire un programme me permettant d'envoyer les informations de mises en marche et d'extinction d'une machine avec l'heure de l'événement dans un tableur
Je simule donc ces changements d'état avec une demande d'appui sur une touche.
Pour écrire dans le tableur, je fais en sorte que le programme créer un fichier .csv dans lequel on peut facilement écrire ce que l'on veut et qui sera retranscrit dans un tableur.
Je peux compiler le programme sans problème mais lorsque qu'il me faut taper la touche qui permet de simuler le changement d'état de la machine, la console bug et le programme ce ferme.

Voici le code :

#include <stdio.h>
#include <stdlib.h>
#include <time.h>

int main(int argc, char*argv[])
{
int Relance;
char OnOff;
long Compt;
long Espace;
Compt=0;
OnOff='ARRET';
FILE* Fichier = NULL;
if (Fichier != NULL)
{
while(1)
{
Espace = Compt*33;
time_t t = time(NULL);
fseek(Fichier,Espace,SEEK_SET);
if (OnOff=='DEMAR')
{
OnOff='ARRET';
}
else
{
OnOff='DEMAR';
}
printf("pour relancer taper 1 puis ENTREE\n");
scanf("%d",Relance);
if (Relance==1);
{
fprintf(Fichier,"%s,%s\n", ctime(&t),OnOff);
fclose(Fichier);
Compt=Compt+1;
}
}
}
else
{
printf("Impossible d'ouvrir le fichier texte");
}
return 0;
}


Merci d'avance.

A voir également:

3 réponses

[Dal] Messages postés 6198 Date d'inscription mercredi 15 septembre 2004 Statut Contributeur Dernière intervention 13 décembre 2024 1 096
Modifié par [Dal] le 22/10/2013 à 14:50
Salut Dredall,

Je peux compiler le programme sans problème

Compile ton programme avec les Warnings, et tu verras déjà un bon nombre de problèmes (avec gcc, l'option -Wall est un bon début, si tu as un autre compilateur, vois ta documentation).

Comprends pourquoi ces warnings sont générés et corrige les un par un.

Ton crash est certainement dû au fait que ton scanf doit passer un pointeur vers une zone de mémoire allouée pouvant accueillir le type de données spécifié, et que là tu passes le contenu de la variable "Relance" et non le pointeur sur l'espace alloué à cette variable, donc
scanf("%d", &Relance);
au lieu de scanf("%d", Relance); pour
int Relance;
.

gcc, avec l'option -Wall te le dit :

format '%d' expects argument of type 'int *', but argument 2 has type 'int'

- ton fichier n'est pas ouvert dans le code que tu postes
- tu fais une boucle while(1) mais rien n'est prévu pour en sortir
- tu utilises des ' pour des chaînes et tu fais des affectations qui montrent que tu confonds les char et les chaînes en C

Voilà un exemple de création et d'usage de char et de chaînes en C.

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int main(void)
{
char OnOff = 'A'; /* un seul caractère entre ' */
char * s1 = "une chaîne en C"; /* plusieurs caractères entre " */
char s2[16] = "alternativement";/* autre déclaration de chaîne */

/* comparaison d'une chaîne */
char * st = "DEMAR";
if (strcmp(st, "DEMAR") == 0)
{
printf("st vaut bien DEMAR\n");
}

/* affectation d'une chaîne */
char * st_vide; /* pointeur sur char non alloué */
st_vide = malloc(6); /* espace pour 5 caractères plus '\0' */
strcpy(st_vide, "ARRET");/* copie */

/* affichage d'une chaîne */
printf("st_vide = %s\n", st_vide); /* spécificateur %s */

/* affichage d'un caractère : char */
printf("OnOff = %c\n", OnOff); /* spécificateur %c */

/* libération de la mémoire allouée avec malloc */
free(st_vide);

return 0;
}


Dal
1
Dredall Messages postés 2 Date d'inscription mardi 22 octobre 2013 Statut Membre Dernière intervention 22 octobre 2013
22 oct. 2013 à 15:19
Le fichier est bien ouvert, j'ai supprimé la ligne par inadvertance en supprimant des commentaires avant de poster sur le forum.
J'ai corrigé le scanf("%d", Relance) en scanf("%d", &Relance) et j'ai changé les ' en "
Je peux maintenant effectué autant de fois que je le désire cependant la fonction fseek ne decale pas le pointeur après le message grâce à Compt comme je l'aurais voulu et je ne comprend pas pourquoi. Le message reste à la même place alors que le pointeur devrait être décalé jusqu'à après "DEMAR" ou "ARRET".
Et mon programme toujours DEMAR et jamais arret.
0
[Dal] Messages postés 6198 Date d'inscription mercredi 15 septembre 2004 Statut Contributeur Dernière intervention 13 décembre 2024 1 096
Modifié par [Dal] le 22/10/2013 à 15:28
poste ton code modifié.

Fait le entre balises <code>, comme cela :

<code>
#include <stdio.h>

int main(void)
{
printf("Hello world\n");
return 0;
}
</code>

Pour que ton programme soit plus lisible.

Si tu as bien lu mon message précédent, tu dois avoir compris qu'il ne suffit pas de remplacer ' par " et que les char et les chaînes sont deux choses différentes et qu'on ne les utilise pas de la même façon.


Dal
0
Dredall Messages postés 2 Date d'inscription mardi 22 octobre 2013 Statut Membre Dernière intervention 22 octobre 2013
22 oct. 2013 à 15:36

#include <stdio.h>
#include <stdlib.h>
#include <time.h>

int main(int argc, char*argv[])
{
int Relance;
char* OnOff;
int Variable;
long Compt;
long Espace;
Compt=0;
OnOff="ARRET";
Variable = 0;
FILE* Fichier = NULL;
Fichier = fopen("Test.csv","w");
if (Fichier != NULL)
{
while(Relance != 2)
{
Espace = Compt*33;
time_t t = time(NULL);
fseek(Fichier,Espace,SEEK_SET);
if (Variable==1)
{
OnOff="ARRET";
Variable = 0;
}
else
{
OnOff="DEMAR";
}
printf("pour relancer taper 1 puis ENTREE ou 2 pour sortir\n");
scanf("%d",&Relance);
if (Relance==1);
{
fprintf(Fichier,"%s,%s\n", ctime(&t),OnOff);
fclose(Fichier);
Compt=Compt+1;
}
}
}
else
{
printf("Impossible d'ouvrir le fichier texte");
}
return 0;
}
0
[Dal] Messages postés 6198 Date d'inscription mercredi 15 septembre 2004 Statut Contributeur Dernière intervention 13 décembre 2024 1 096
22 oct. 2013 à 17:26
Pour OnOff, tu crée un pointeur sur char non alloué. De plus, tu utilise = alors que je t'ai dit d'utiliser strcpy.

Tu peux faire cela, en revanche :

char OnOff[6];
strcpy(OnOff, "ARRET");
ailleurs dans ton code, tu fais des affectations illégales, corrige cela aussi.

si tu fais
Fichier = fopen("Test.csv", "w");
, cela signifie que ton fichier est nouvellement créé, et non pas préexistant.

http://www.cplusplus.com/reference/cstdio/fopen/

Donc, tu ne peux pas faire un fseek sur des données qui n'existent pas.

Pour t'en convaincre fais ceci dans ton code :

            if (fseek(Fichier, Espace, SEEK_SET) != 0)
{
printf("Erreur : fseek a échoué\n");
return EXIT_FAILURE;
}

Vois http://www.cplusplus.com/reference/cstdio/fseek/

Je ne sais pas ce que tu veux faire. Si tu veux simplement écrire "Espace" fois le caractère espace, tu dois écrire "Espace" fois le caractère espace et non pas ce que tu fais. Si tu veux faire autre chose, clarifie, stp.

Il y a un
;
à la fin de ton
if (Relance == 1)
, retire le.

Si tu fais
fclose(Fichier);
alors que ta boucle n'est pas terminée, tu ne pourras plus rien écrire dans Fichier. Ce
fclose(Fichier);
devrait être à l'extérieur de la boucle while.


Dal
0
[Dal] Messages postés 6198 Date d'inscription mercredi 15 septembre 2004 Statut Contributeur Dernière intervention 13 décembre 2024 1 096
Modifié par [Dal] le 22/10/2013 à 17:32
bien sûr, pour utiliser strcpy et les autres fonctions de manipulation de chaînes en C, tu dois inclure le header string.h, comme indiqué dans mon précédent message.

Dal
0