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

Soyez le premier à donner votre avis sur cette source.

Vue 6 604 fois - Téléchargée 293 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
Messages postés
57
Date d'inscription
mercredi 16 octobre 2002
Statut
Membre
Dernière intervention
31 mars 2004

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
Messages postés
3006
Date d'inscription
dimanche 14 avril 2002
Statut
Membre
Dernière intervention
31 décembre 2008

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 !
Messages postés
21041
Date d'inscription
jeudi 23 janvier 2003
Statut
Modérateur
Dernière intervention
21 août 2019
29
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é.
Messages postés
3006
Date d'inscription
dimanche 14 avril 2002
Statut
Membre
Dernière intervention
31 décembre 2008

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.