Une date par ligne dans un txt (vc++)

Soyez le premier à donner votre avis sur cette source.

Vue 6 713 fois - Téléchargée 297 fois

Description

Comme promis à un participant, une dialogbox avec un calendrier et un editbox.
Un bouton ajouter et un trier. La date est mise en début de ligne au
format jj/mm/yyyy + space + texte(maxi 259). Le bouton trier supprime les
lignes dont date < CeJour et range les autres sur ordre croissant. La seule
chose intéressante(je crois) est la fonction qui trie vu que les
enregistrements sont de taille variable. Je sais que le format de fichier
par ligne est mauvais pour la vitesse mais c'est ce qu'on m'avait demandé.

Source / Exemple :


#include <windows.h>
#include <commctrl.h> // et linker avec comctl32.lib
#include "resource.h"
#include "OperTxt.h"

HWND hdat, htxt;
SYSTEMTIME sttm;

char szbuff[260];
char *szappname = "DateTxt";
char *szfrmtDTP = "dd/MM/yyyy";
char *szFlName = "Datage.txt";
char *szERRWRITE = "ERREUR D'ECRITURE";

void InitInstance()
{
  SYSTEMTIME stArr[2];
  char *c;
  SendMessage(hdat, DTM_SETFORMAT, 0, (long) szfrmtDTP);
  GetLocalTime(stArr); // hdat, mini CeJour, maxi 31/12/9999
  stArr[1].wDay = 31; stArr[1].wMonth = 12; stArr[1].wYear = 9999;
  SendMessage(hdat, DTM_SETRANGE, GDTR_MIN | GDTR_MAX, (long) &stArr);
  txtSetMinDay(stArr); // pendant qu'on a date du jour
  c = szbuff + GetModuleFileName(0, szbuff, 260);
  while(*c != '\\') c--; *c = 0;
  SetCurrentDirectory(szbuff); // assure txt dans dossier de app, change si tu veux
}

BOOL CALLBACK AppDlgProc(HWND hdlg, UINT mssg, WPARAM wParam, LPARAM lParam)
{
  switch(mssg) {
    case WM_INITDIALOG:
      SetClassLong(hdlg, GCL_HICON, (long)LoadIcon(0, IDI_APPLICATION));
      hdat = GetDlgItem(hdlg, ID_DATE);
      htxt = GetDlgItem(hdlg, IDED_TXT);
      SendMessage(htxt, EM_SETLIMITTEXT, 259, 0);
      InitInstance();
      if(!txtOpenFile(szFlName)) {
        strcpy(szbuff, szFlName); strcpy(szbuff + 10, "  INDISPONIBLE");
        ShowWindow(hdlg, SW_SHOWNORMAL);
        MessageBox(hdlg, szbuff, szappname, MB_ICONEXCLAMATION);
        EndDialog(hdlg, 0);
      }
      return 1;
    case WM_COMMAND:
      switch(wParam) {
        case IDBT_ADD: // en fin de fichier
          if(!GetWindowText(htxt, szbuff, 260)) {
            MessageBeep(0); return 0; // texte obligatoire
          }
          SendMessage(hdat, DTM_GETSYSTEMTIME, 0, (long) &sttm);
          if(txtAddLine(&sttm, szbuff)) SetWindowText(htxt, 0);
          else MessageBox(hdlg, szERRWRITE, szappname, MB_ICONEXCLAMATION);
          return 0;
        case IDBT_TRI:
          SetCursor(LoadCursor(0, IDC_WAIT));
          txtNormalize(); // je pense mettre un thread + tard
          if(txtNormalize() == 0xFFFFFFFF) {
            MessageBox(hdlg, "MANQUE MEMOIRE", szappname, MB_ICONEXCLAMATION);
          }
          SetCursor(LoadCursor(0, IDC_ARROW));
          PostMessage(hdlg, WM_NEXTDLGCTL, 0, 0);
          return 0;
        case IDCANCEL:
          txtCloseFile();
          EndDialog(hdlg, 0);
      }
  }
  return 0;
}

int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE, PSTR, int)
{
  InitCommonControls();
  DialogBox(hInstance, MAKEINTRESOURCE(IDD_APP), NULL, AppDlgProc);
  return 0;
}

Conclusion :


OperTxt.cpp contient la gestion sur disque. La seule partie intéressante,
il me semble, est txtNormalize(). On lit tout dans un buffer alloué par
VirtualAlloc() et on procède à un genre d'indexation à posteriori. Ensuite
on trie le tableau d'indexation en ordre croissant sur son champ date et
on remet dans le fichier si >= CeJour.
Bonne lecture.

Codes Sources

A voir également

Ajouter un commentaire Commentaires
Greengold Messages postés 57 Date d'inscription mercredi 16 octobre 2002 Statut Membre Dernière intervention 31 mars 2004
9 mars 2004 à 23:00
Merci pour ta source. C'est pile poile ce dont j'avais besoin.

Pour ceux qui ne comprennent pas pourquoi cette source ne marche pas, ya un ptit commentaire dans le code qui est : linker avec comctl32.lib.
Ca signifie juste qu'il faut aller dans le menu Project, sous-menu Settings. Dans la fenêtre, il faut choisir l'onglet link et ajouter dans une des zones de texte : comctl32.lib.

C'est pas forcément évident pour tout le monde :)

9/10
cs_Kirua Messages postés 3006 Date d'inscription dimanche 14 avril 2002 Statut Membre Dernière intervention 31 décembre 2008
23 févr. 2003 à 23:07
ah ok :) mais d'u nautre coté, ça limite les données par enregistrement non ? si tu détermines un enregistrement de 50 octets (caractères), tu ne pourras jamais faire plus long !
BruNews Messages postés 21041 Date d'inscription jeudi 23 janvier 2003 Statut Modérateur Dernière intervention 21 août 2019 19
26 janv. 2003 à 12:26
parce que il y a obligation de recherche de fin de ligne pour trouver enregistrement suivant. Un format de fichier par structures d'enregistrement de taille fixe consomme + de place disque mais permet un pointage immédiat sur l'enregistrement désiré.
cs_Kirua Messages postés 3006 Date d'inscription dimanche 14 avril 2002 Statut Membre Dernière intervention 31 décembre 2008
26 janv. 2003 à 12:17
pq c mauvais pr la vitesse? ça m'intéresse ça. merci de répondre ;)

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.