IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

C Discussion :

suppression une partie de contenu de fichier


Sujet :

C

  1. #1
    Membre éclairé
    Inscrit en
    Mai 2009
    Messages
    392
    Détails du profil
    Informations forums :
    Inscription : Mai 2009
    Messages : 392
    Par défaut suppression une partie de contenu de fichier
    Bonjour,

    J'ai trouvé u ne solution permettant de supprimer des lignes vides et des colonnes vides de fichier.
    Exemple de fichier "entree.txt":

    12 11001
    15 01100
    21 10001
    13 00101
    Nous obtenons le fichier "sortie.txt":

    12 1101
    15 0110
    21 1001
    23 0000
    13 0011
    Le fichier de position de colonnes supprimées "position ":
    3
    3 c'est la position de colonne supprimée.


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    int enlever_lig_col(int *nbAF, int *nbAFS, int *nbAFNS) {
        FILE *pFile, *pFileOut, *pCol, *fp, *fpAttF, *fp_cause, *fpNS;
        char sLine[MAXLINE], s[100], t[100], ch[100], type[10], attribut[20], comparateur[10], valeur[20];
        int i, j, h=0, k=0, nColumn[32] = {0}, nCpt = 0, nAttribLength= 0, nMaxAttribLength = 0;
        int dataTabStringMax = STEP;
        int nShift = 0, nbA=0, nbAS=0, nbANS=0;
        int vv, pos, nbO=0;
        dataStruct *dataTabString;
        pFile = fopen("entree.txt", "r");
        pFileOut = fopen("sortie.txt", "w+");
        pCol = fopen("position.txt", "w+");
     
        if (pFile && pFileOut) {
            dataTabString = (dataStruct *) malloc(dataTabStringMax * sizeof(dataStruct));
     
            while (fgets(sLine, MAXLINE, pFile)) {
     
                memset(&dataTabString[nCpt], 0, sizeof(dataStruct));
                sscanf(sLine, "%d%s", &dataTabString[nCpt].sNum, dataTabString[nCpt].sAttrib);
                if (strlen(dataTabString[nCpt].sAttrib) > 0)
                    nAttribLength = strlen(dataTabString[nCpt].sAttrib)+ 1;
     
                if (nAttribLength>0) {
     
                    sscanf(sLine, "%d%s", &dataTabString[nCpt].sNum, dataTabString[nCpt].sAttrib);
                    for (i = 0; i<nAttribLength; i++) {
                        if (dataTabString[nCpt].sAttrib[i] == '0')
                            nColumn[i]+=1;
                    }
                    nCpt+=1;
                    if (nAttribLength > nMaxAttribLength)
                        nMaxAttribLength = nAttribLength;
                }
                if (nCpt == dataTabStringMax) {
                    dataTabStringMax += STEP;
                    dataTabString = (dataStruct *) realloc(dataTabString,
                            dataTabStringMax * sizeof(dataStruct));
                    if (dataTabString == NULL)
                        exit(1);
                }
            }
     
     
     
            // Lecture tableau de structures pour supprimer les "0"
            for (j = 0; j<nCpt; j++) {
     
                nShift = 0;
                for (i = 0; i<nMaxAttribLength; i++) {
                    if (nColumn[i] == nCpt) {
                        memmove(&dataTabString[j].sAttrib[i-nShift], &dataTabString[j].sAttrib[i-nShift+1], strlen(&dataTabString[j].sAttrib[i-nShift+1]) + 1);
                        nShift+=1;
                        if (j == 0) {
                            //printf("pos = %d\n",i);
                            fprintf(pCol, "%d\n", i);
                        }
                    }
                }
                if (strcspn(dataTabString[j].sAttrib, "1") <strlen(dataTabString[j].sAttrib))
     
                {
                    fprintf(pFileOut, "%d %s\n", dataTabString[j].sNum, dataTabString[j].sAttrib);
     
                    nbO++;
     
                }
            }
     
     
            free(dataTabString);
     
        }
    }

    - Pouvez vous me détailler encore étape par étape cette solution ?

    - Que présentent les deux variables de deux boucles for : nCpt et
    nMaxAttribLength ?

    - quelle est le rôle de la fonction memmove() et memset() ?

    Quelle est la complexité de cette solution ?

    Merci.

  2. #2
    Membre éclairé
    Inscrit en
    Mai 2009
    Messages
    392
    Détails du profil
    Informations forums :
    Inscription : Mai 2009
    Messages : 392
    Par défaut
    Bonjour,

    Pouvez vous m'expliquer comment ce code nous permet de supprimer des lignes et des colonnes à partir d'un fichier ?

    Merci.

Discussions similaires

  1. [Batch] Suppression d'une partie du titre de fichiers
    Par M.A.X.I.M.E. dans le forum Scripts/Batch
    Réponses: 1
    Dernier message: 09/08/2013, 16h59
  2. Réponses: 3
    Dernier message: 18/08/2012, 09h54
  3. Suppression d'une partie du contenu d'une colonne
    Par tvd_marc.white dans le forum Langage SQL
    Réponses: 4
    Dernier message: 26/09/2011, 14h11
  4. Copier une partie du contenue d'un fichier dans un autre fichier
    Par jvkd59 dans le forum VB 6 et antérieur
    Réponses: 21
    Dernier message: 18/09/2010, 15h49
  5. Réponses: 4
    Dernier message: 28/03/2006, 23h05

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo