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.