2009-09-15 7 views
2

Je veux créer une série de fichiers sous le répertoire "log" que chaque fichier nommé en fonction de l'heure d'exécution. Et dans chacun de ces fichiers, je veux stocker quelques informations de journal pour mon programme comme le prototype de fonction qui agit, etc. D'habitude, je utiliser la dure de fopen (« log/*** », « a ») qui n'est pas pour cette purpose.And Je viens d'écrire une fonction d'horodatage:comment créer des fichiers nommés avec l'heure actuelle?

char* timeStamp(char* txt){ 
    char* rc; 
    char timestamp[16]; 
    time_t rawtime = time(0); 
    tm *now = localtime(&rawtime); 

    if(rawtime != -1) { 
    strftime(timestamp,16,"%y%m%d_%H%M%S",now); 
    rc = strcat(txt,timestamp); 
    } 
    return(rc); 
} 

Mais je ne sais pas que faire ensuite. S'il vous plait, j'ai besoin de votre aide avec ceci!

+8

C et C++ vont vous obtenir des réponses radicalement différentes ... – GManNickG

+0

+1 à GMan. Je vous ai donné une réponse C (pas de code, désolé - c'est votre travail), mais si vous voulez une réponse C++, ne le marquez pas C (et vice versa). Ils sont deux langues différentes. Ce n'est pas parce que l'un est un surensemble (la plupart du temps) strict de l'autre que vous devez les regrouper en un seul. –

+0

désolé pour cela ... Je veux juste résoudre ce problème, pas l'intention de spécifier la langue. – iBacchus

Répondre

3

Déclare assez grand tableau char pour contenir 16 + "log/" (donc 20 caractères au total) et l'initialiser à "log/", puis utilisez strcat() ou quelque chose lié à ajouter la chaîne de temps retourné par votre fonction à la fin de votre tableau. Et voilà!

Notez comment fonctionne l'addition de chaîne: Votre tableau char a 16 caractères, ce qui signifie que vous pouvez mettre 15 caractères plus un octet nul. C'est important de ne pas l'oublier. Si vous avez besoin d'une chaîne de 16 caractères, vous devez la déclarer comme char timestamp[17] à la place. Notez que "log/" est une chaîne de 4 caractères, donc il prend 5 caractères (un pour l'octet nul à la fin), mais strcat() écrasera à partir de l'octet nul à la fin, de sorte que vous finirez avec le droit nombre. Ne comptez pas le terminateur nul deux fois, mais surtout, ne l'oubliez pas. Le débogage est un problème beaucoup plus important.

EDIT: Pendant que nous y sommes, j'ai mal interprété votre code. Je pensais que ça renvoyait juste une chaîne avec le temps, mais il semble que ça ajoute du temps à une chaîne passée. C'est probablement mieux que ce que je pensais que tu faisais. Cependant, si vous le souhaitez, vous pouvez simplement faire en sorte que la fonction fasse tout le travail - elle place "log/" dans la chaîne avant de mettre l'horodatage. Ce n'est pas si dur.

+0

merci beaucoup! – iBacchus

1

semble que vous avez résolu la plupart du temps déjà - pour créer un fichier comme vous décrivez:

char filename[256] = "log/"; 
timeStamp(filename); 
f = fopen(filename, "a"); 

Ou voulez-vous faire quelque chose ne plus?

+0

Pourquoi ne pas simplement 'char filename [256] =" log/";'? –

+0

changer pour utiliser snprintf, strncat et amis et je vais vous donner un +1. Ne pas encourager les dépassements de tampon –

+1

Merci, vous avez raison. –

1

étapes pour créer (ou écrire à) un fichier d'accès séquentiel en C++:

1.Declare un courant nom de variable:

ofstream fout; //each file has its own stream buffer 

ofstream est court pour le flux de fichier de sortie fout est le nom de la variable de flux (et peut être n'importe quel nom de variable C++ légal.) Attribuer un nom à la variable de flux "fout" est utile pour se souvenir de que l'information est "sortie" du fichier.

2.Open le fichier:

fout.open (nom de fichier, ios :: out);

fsort est le flux nom de la variable précédemment déclarée « scores.dat » est le nom du fichier ios :: out est le mode de fonctionnement de la vapeur (votre compilateur ne peut pas exiger que vous spécifiez le mode de fonctionnement de flux.)

3.Écrire des données dans le fichier:

fout<<grade<<endl; 
fout<<"Mr"; 

Les données doivent être séparés par des espaces ou des caractères de fin de ligne (retour chariot), ou les données entrent ensemble dans le fichier et être illisible. Essayez d'enregistrer les données dans le fichier de la même manière que vous l'affichez à l'écran.

Si le fichier d'en-tête iomanip.h est utilisé, vous pourrez utiliser des commandes de formatage familières avec sortie de fichier.

fout<<setprecision(2); 
fout<<setw(10)<<3.14159; 

4.Fermez le fichier:

fout.close(); 

Fermeture du fichier écrit toutes les données restantes dans la mémoire tampon au fichier, libère le fichier du programme et met à jour le répertoire des fichiers pour refléter ce fichier nouvelle taille. Dès que votre programme a fini d'accéder au fichier, le fichier doit être fermé. La plupart des systèmes ferment tous les fichiers de données à la fin d'un programme. Si les données restent dans la mémoire tampon à la fin du programme, vous risquez de perdre ces données. Ne prenez pas la chance --- fermez le fichier!

3

Qu'en est-ce:

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

#define LOGNAME_FORMAT "log/%Y%m%d_%H%M%S" 
#define LOGNAME_SIZE 20 

FILE *logfile(void) 
{ 
    static char name[LOGNAME_SIZE]; 
    time_t now = time(0); 
    strftime(name, sizeof(name), LOGNAME_FORMAT, localtime(&now)); 
    return fopen(name, "ab"); 
} 

Vous utiliseriez comme ceci:

FILE *file = logfile(); 
// do logging 
fclose(file); 

Gardez à l'esprit que localtime() est thread-safe!

Questions connexes