Date : 12/05/2012
Version 1
Fichier source disponible ici ogameReader.c
Executable ici (ogameReader.exe)
Fichier batch exemple ogame_Pillage.bat
Fichier exemple t.txt

-----------------------------------------------------------
Date : 18/05/2012
Version 1.1
Fichier source disponible ici ogameReader_V1.1.c
Executable ici (ogameReader_V1.1.exe)
Fichier batch exemple ogame_Pillage.bat

/*******************************************************************************/ /* Allègre Nicolas, (ESISAR P2012) */ /*--------------------------- Fichier C --------------------------------------*/ /* ogameReader.c * * But : Pouvoir avoir rapidement la somme des ressources récoltés dans Ogame, * notamment lors de pillage. * * * Auteur : Allègre Nicolas * Création : 7 mai 2012 * Modifications : * - 12 mai 2012 par Allègre Nicolas : Relecture et formatage * - 12 mai 2012 par Allègre Nicolas : Version 1 complète * - 18 mai 2012 par Allègre Nicolas : Version 1.1 : Rentabilité formatée pour le forum * */ //20min our la v0 /*******************************************************************************/ /** * @file ogameReader.c * * Fait la somme des ressources de rapport présentes dans un fichier. * * @version 12-05-2012, v1 * @author Allègre Nicolas * */ /* Includes ------------------------------------------------------------------*/ /* Standard includes. */ #include <stdio.h> #include <stdlib.h> #include <string.h> #include <assert.h> #include <ctype.h> #include <inttypes.h> /* Private define ------------------------------------------------------------*/ //#define DEBUG #define FALSE 0 //Le booléen FAUX #define TRUE 1 //le booléen VRAI #define NBARG_MIN 1 //nombre minimun d'arguments pris par le programme //#define USE_OF_FLOAT #define RESSOURCE_METAL 0 #define RESSOURCE_CRISTAL 1 #define RESSOURCE_DEUTERIUM 2 #define RESSOURCE_END 10 /* Exit values define */ //correct value #define EXIT_OK 0 // Error value #define EXIT_BAD_ARG_FEW -1 #define EXIT_BAD_OPEN_FILE_R -2 /* Private struct, enum, typedef ---------------------------------------------*/ typedef unsigned int uint; typedef unsigned long long ulong; /* Private variables ---------------------------------------------------------*/ /* Private function prototypes -----------------------------------------------*/ void pause(void); int asking_help(const char s[]); //if the user ask help (-? | /?) void print_help(void); void ReadingFile(char *fileName); void FindFloatValues(char *buf, float *m, float *c, float *d); void FindIntValues(char *buf, ulong *m, ulong *c, ulong *d); void PrintfFloatResult(float m, float c, float d); void PrintfIntResult(ulong m, ulong c, ulong d); void PrintDoted(FILE *f, ulong n); ulong DotedToInt(char *buf, int *begin); void SaveResult(char *fileName, ulong m, ulong c, ulong d); void PrintFormated(FILE *f, ulong m, ulong c, ulong d); /* Extern functions ----------------------------------------------------------*/ /* Public functions ----------------------------------------------------------*/ /* Private functions ---------------------------------------------------------*/ int main(int argc, char **argv){ assert(NBARG_MIN >= 0); atexit(pause); //Vérification des arguments if (argc < (1 + 1)) { //help fprintf(stderr, "ERROR : Too few argument.\n"); print_help(); exit(EXIT_BAD_ARG_FEW); } if (argc>1 && asking_help(argv[1])==TRUE) { print_help(); exit(EXIT_OK); } else { if (argc < (1 + NBARG_MIN)) { fprintf(stderr, "ERROR : Too few argument, need almost %d.\n", NBARG_MIN); print_help(); exit(EXIT_BAD_ARG_FEW); } ReadingFile(argv[1]); } return EXIT_OK; } void pause(void) { printf("\n\nVeuillez appuyer sur la touche ENTER !!\n"); getchar(); } /*--------------------------------------------------------------------------------------------------*/ /** \brief Says if a string is a argument asking help. * * Boolean function check the string to find /?, -?, /help or -help. * * @param s string to look * * @return TRUE if found, FALSE else * * @author Allègre Nicolas * @version 18-10-2010 */ int asking_help(const char s[]) { unsigned int longueur = strlen(s); if (s[0]=='-' || s[0]=='/') { if (longueur==2 && s[1]=='?') return TRUE; if (longueur==5) { if (s[1]=='h' && s[2]=='e' && s[3]=='l' && s[4]=='p') return TRUE; if (s[1]=='a' && s[2]=='i' && s[3]=='d' && s[4]=='e') return TRUE; } } return FALSE; } /*--------------------------------------------------------------------------------------------------*/ /** \brief Print the help. * * @author Allègre Nicolas * @version 12-05-2012 */ void print_help(void) { printf("\ Utilisation : ogameReader nom_fichier\n\n\ Sommeur de ressource d'Ogame V1 !!\n\n\ nom_fichier nom ou chemin du fichier contenant les rapports de pillage.\n\n"); } void ReadingFile(char *fileName) { FILE *file; char buf[128]; ulong isommeMetal = 0; ulong isommeCristal = 0; ulong isommeDeuterium = 0; float fsommeMetal = 0.; float fsommeCristal = 0.; float fsommeDeuterium = 0.; file = fopen(fileName, "r"); if(file == NULL){ printf("ERROR : \"%s\" can't be open in reading mode.\n", fileName); exit(EXIT_BAD_OPEN_FILE_R); } //**Lecture dans un fichier :**// do { if(fgets(buf, sizeof(buf), file) == NULL) /*Capture de la ligne dans buf*/ { if(0 != feof(file)) /*Si c'est la fin du fichier on sort de la boucle*/ break; else { (void)fprintf(stderr,"Erreur de lecture du fichier \"%s\"\n",fileName); break; } } //action a faire avec buf #ifdef USE_OF_FLOAT FindFloatValues(buf, &fsommeMetal, &fsommeCristal, &fsommeDeuterium); #else FindIntValues(buf, &isommeMetal, &isommeCristal, &isommeDeuterium); #endif } while(!feof(file)); /*Si c'est la fin du fichier on sort de la boucle*/ fclose(file); #ifdef USE_OF_FLOAT PrintfFloatResult(fsommeMetal, fsommeCristal, fsommeDeuterium); #else PrintfIntResult(isommeMetal, isommeCristal, isommeDeuterium); #endif SaveResult(fileName, isommeMetal, isommeCristal, isommeDeuterium); } //Ne marche que pour des valeur infereur au million (999.999) (a cause du float) //temporaire void FindFloatValues(char *buf, float *m, float *c, float *d) { float i, j, k; int result; result = sscanf(buf, "%f unités de métal, %f unités de cristal et %f", &i, &j, &k); if(result == 0) { result = sscanf(buf, "La flotte amène %f unités de métal, %f unités de cristal et %f", &i, &j, &k); } if(result == 3) { printf("%d : Metal=%.4f, Cristal=%.4f, Deuterium=%.4f\n", result, i, j, k); *m += i*1000; *c += j*1000; *d += k*1000; printf("Total : Metal=%.4f, Cristal=%.4f, Deuterium=%.4f\n\n", *m, *c, *d); } else{ printf("ERROR : (%d) la ligne ne peut etre lu : \"%s\"\n", result, buf); } } void FindIntValues(char *buf, ulong *m, ulong *c, ulong *d) { ulong metal = 0, cristal = 0, deuterium = 0; char tmp; int i = 0; int ressource = RESSOURCE_METAL; char continu = TRUE; if(buf == NULL) { return; } tmp = buf[0]; while(tmp != '\0' && continu == TRUE) { if(isdigit(tmp)) { switch(ressource) { case RESSOURCE_METAL : metal = DotedToInt(buf, &i); ressource = RESSOURCE_CRISTAL; printf(" Metal, "); break; case RESSOURCE_CRISTAL : cristal = DotedToInt(buf, &i); ressource = RESSOURCE_DEUTERIUM; printf(" Cristal, "); break; case RESSOURCE_DEUTERIUM : deuterium = DotedToInt(buf, &i); ressource = RESSOURCE_END; printf(" Deuterium."); //no break default : continu = FALSE; putchar('\n'); break; } } i++; tmp = buf[i]; } if(continu == TRUE) { printf("ERROR : la ligne ne peut etre lu : \"%s\"\n", buf); } if(ressource != RESSOURCE_END) { printf("WARNING : seul %d nombre a ete lu !!\n", ressource); } *m += metal; *c += cristal; *d += deuterium; printf("Total : Metal=%"PRIu64", Cristal=%"PRIu64", Deuterium=%"PRIu64"\n\n", *m, *c, *d); } void PrintfFloatResult(float m, float c, float d) { ulong i, j, k; i = (ulong)m; j = (ulong)c; k = (ulong)d; PrintfIntResult(i, j, k); } void PrintfIntResult(ulong m, ulong c, ulong d) { printf("Rentabilite :\n"); printf("Metal="); PrintDoted(stdout, m); printf(", Cristal="); PrintDoted(stdout, c); printf(", Deuterium="); PrintDoted(stdout, d); putchar('\n'); } void PrintDoted(FILE *f, ulong n) { ulong i = 1; //puissance de 10 int j = 0; //Nombre de la puissance de 10 de i ulong tmp = 0; char continu = TRUE; //Avoir laa dernière puissance de dix du nombre while(continu == TRUE) { if(n / i == 0) { //On descend jusqu'à l'unité continu = FALSE; i /= 10; j--; } else { i *= 10; j++; } } //Ici i = 10^j #ifdef DEBUG printf("\ni=%"PRIu64", ", i); #endif continu = TRUE; tmp = 0; if(i == 0) { fprintf(f, "%"PRIu64"", n); } else { while(continu == TRUE) { fprintf(f, "%"PRIu64"", n / i - tmp); if(j % 3 == 0 && j != 0) { putc('.', f); } tmp = (n / i) * 10; i /= 10; j--; if( i == 0 ) { continu = FALSE; } } } } ulong DotedToInt(char *buf, int *begin) { ulong result = 0; char tmp; int indice; if(buf == NULL || begin == NULL) { return 0; } indice = *begin; tmp = buf[indice]; while(tmp != '\0' && isdigit(tmp)) { result = result * 10 + ((unsigned char)tmp - '0'); indice++; if(buf[indice] == '.') { indice++; } tmp = buf[indice]; } printf("%"PRIu64"", result); *begin = indice - 1; return result; } void SaveResult(char *fileName, ulong m, ulong c, ulong d) { FILE *file; file = fopen(fileName, "a"); if(file == NULL){ printf("ERROR : \"%s\" can't be open in reading mode.\n", fileName); exit(EXIT_BAD_OPEN_FILE_R); } PrintFormated(file, m, c, d); fclose(file); } void PrintFormated(FILE *f, ulong m, ulong c, ulong d) { if(f == NULL) { return; } fprintf(f, "\n[center][color=#00ff00][img]http://img301.imageshack.us/img301/3650/rentaiw0.png[/img]\n[img]http://img451.imageshack.us/img451/3976/metalic2.png[/img] "); PrintDoted(f, m); fprintf(f,"\n\n[img]http://img217.imageshack.us/img217/1948/cristalrd2.png[/img] "); PrintDoted(f, c); fprintf(f,"\n\n[img]http://img105.imageshack.us/img105/5311/deutym6.png[/img] "); PrintDoted(f, d); fprintf(f,"[/color][/center]"); }