Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

Aide sur traitement du fichier

12 réponses
Avatar
Rim msedi
Salut,

J'ai un fichier qui se compose de deux champs :

- numero pr=E9sent=E9 par un entier
- attribut pr=E9sent=E9 par une chaine caract=E8re.

On a la m=EAme taille pour le champ attribut dans toutes les lignes du
fichier.

Par exemple, Soit le fichier nomm=E9 essai.txt:

1 110101
2 100101
3 110101
4 000101
5 000000
6 110101
7 110101
8 000000
9 010101
10 100101

Le travail demand=E9 est:

- Supprimer des lignes du fichier essai.txt qui contiennent comme
chaine caractere "000000"
Dans notre exemple, on doit supprimer les deux lignes suivantes:

5 000000
8 000000

-Supprimer des colonnes du la chaine attribut pour chaque ligne
sachant que cette colonne est tout =E0 0 dans toutes les chaines du
fichier.

Dans notre exemple, on remarque que la colonne 3 et 5 sont toutes =E0 0.


En conclusion, on obtient le r=E9sultat suivant qui pr=E9sente un fichier
(on peut travailler sur le m=EAme fichier ou autre)
apr=E8s la suppression des lignes et des colonnes faite :

1 1111
2 1011
3 1111
4 0011
6 1111
7 1111
9 0111
10 1011


Je dois faire un programme C sous Windows permettant du supprimer des
lignes et des colonnes comme d=E9crit pr=E9c=E9dament.
J'ai trouv=E9 des difficult=E9s =E0 manipuler les positions du curseur dans
un fichier de plus je ne sais pas si il y a des
fonctions pr=E9d=E9finis dans C qui permettent du supprimer des lignes et
des colonnes selon un crit=E8re.

S'il vous plait,Pouvez-vous m'aider ?

Merci.

10 réponses

1 2
Avatar
Christian ASTOR
On 17 juil, 12:40, Rim msedi wrote:

- Supprimer des lignes du fichier essai.txt qui contiennent comme
chaine caractere "000000"
Dans notre exemple, on doit supprimer les deux lignes suivantes:

5    000000
8    000000



Teste juste ton champ attribut et tu n'insères la ligne lue que si
!= "000000"

Exemple rapide =>

#include <tchar.h>
#include <iostream>

#define MAXLINE 1024

int _tmain(int argc, _TCHAR* argv[])
{
char sLine[MAXLINE];
char sNum[10], sAttrib[32];
FILE *pFile, *pFileOut;
pFile = fopen("test.txt","r");
pFileOut = fopen("test2.txt","w");
if (pFile && pFileOut)
{
while (fgets(sLine, MAXLINE, pFile))
{
strncpy(sNum, sLine, 5);
sNum[5] = '';
strncpy(sAttrib, &sLine[5], 6);
sAttrib[6] = '';
if (strcmp(sAttrib, "000000") != 0)
fprintf(pFileOut, "%s%sn", sNum, sAttrib);
}
fclose(pFile);
fclose(pFileOut);
}
return 0;
}

-Supprimer des colonnes du la chaine attribut pour chaque ligne
sachant que cette colonne est tout à 0 dans toutes les chaines du
fichier.



Tu avais déjà demandé ça : j'avais posté un exemple C/Win32 pour
supprimer une colonne : à toi d'adapter/améliorer pour 2 colonnes et
en C standard....
Avatar
ByB
Rim msedi avait prétendu :
Salut,

J'ai un fichier qui se compose de deux champs :

- numero présenté par un entier
- attribut présenté par une chaine caractère.

On a la même taille pour le champ attribut dans toutes les lignes du
fichier.

Par exemple, Soit le fichier nommé essai.txt:

1 110101
2 100101
3 110101
4 000101
5 000000
6 110101
7 110101
8 000000
9 010101
10 100101

Le travail demandé est:

- Supprimer des lignes du fichier essai.txt qui contiennent comme
chaine caractere "000000"
Dans notre exemple, on doit supprimer les deux lignes suivantes:

5 000000
8 000000

-Supprimer des colonnes du la chaine attribut pour chaque ligne
sachant que cette colonne est tout à 0 dans toutes les chaines du
fichier.

Dans notre exemple, on remarque que la colonne 3 et 5 sont toutes à 0.


En conclusion, on obtient le résultat suivant qui présente un fichier
(on peut travailler sur le même fichier ou autre)
après la suppression des lignes et des colonnes faite :

1 1111
2 1011
3 1111
4 0011
6 1111
7 1111
9 0111
10 1011


Je dois faire un programme C sous Windows permettant du supprimer des
lignes et des colonnes comme décrit précédament.
J'ai trouvé des difficultés à manipuler les positions du curseur dans
un fichier de plus je ne sais pas si il y a des
fonctions prédéfinis dans C qui permettent du supprimer des lignes et
des colonnes selon un critère.

S'il vous plait,Pouvez-vous m'aider ?

Merci.



a) Lire tout le fichier dans un tableau.
b) Effectuer les traitements en mémoire.
c) Effacer le fichier lu, et créer un nouveau fichier avec le nom de
l'ancien et dans lequel tu écris les données du tableau selon le format
prévu.
Avatar
Rim msedi
On 17 juil, 21:50, ByB wrote:
Rim msedi avait prétendu :



> Salut,

> J'ai un fichier qui se compose de deux champs :

> - numero présenté par un entier
> - attribut présenté par une chaine caractère.

> On a la même taille pour le champ attribut dans toutes les lignes du
> fichier.

> Par exemple, Soit le fichier nommé essai.txt:

> 1    110101
> 2    100101
> 3    110101
> 4    000101
> 5    000000
> 6    110101
> 7    110101
> 8    000000
> 9    010101
> 10   100101

> Le travail demandé est:

> - Supprimer des lignes du fichier essai.txt qui contiennent comme
> chaine caractere "000000"
> Dans notre exemple, on doit supprimer les deux lignes suivantes:

> 5    000000
> 8    000000

> -Supprimer des colonnes du la chaine attribut pour chaque ligne
> sachant que cette colonne est tout à 0 dans toutes les chaines du
> fichier.

> Dans notre exemple, on remarque que la colonne 3 et 5 sont toutes à 0 .

> En conclusion, on obtient le résultat suivant qui présente un fichi er
> (on peut travailler sur le même fichier ou autre)
> après la suppression des lignes et des colonnes faite :

> 1    1111
> 2    1011
> 3    1111
> 4    0011
> 6    1111
> 7    1111
> 9    0111
> 10   1011

> Je dois faire un programme C sous Windows permettant du supprimer des
> lignes et des colonnes comme décrit précédament.
> J'ai trouvé des difficultés à manipuler les positions du curseur dans
> un fichier de plus je ne sais pas si il y a des
> fonctions prédéfinis dans C qui permettent du supprimer des lignes et
> des colonnes selon un critère.

> S'il vous plait,Pouvez-vous m'aider ?

> Merci.

a) Lire tout le fichier dans un tableau.
b) Effectuer les traitements en mémoire.
c) Effacer le fichier lu, et créer un nouveau fichier avec le nom de
l'ancien et dans lequel tu écris les données du tableau selon le form at
prévu.



Salut,

Je reformule ma demande.
J'ai un fichier texte bien formé contient deux champs: objet et
attribut.
tous les objets sont des entiers et tous les attributs sont de chaines
de caractères de même taille.
chaque ligne contient un objet et son attribut par exemple:

essai.txt:

10 1110001
20 1010100
30 0100101
37 0000000
40 1000101
50 0000000
80 1110001
100 1010001


1) je voudrais supprimer les lignes qui contiennent une chaine qui est
toute à 0 par exemple dans notre on a "0000000"

Donc, on doit supprimer les lignes suivantes:
37 0000000
50 0000000

2) Je voudrais supprimer les 0 de même position dans chaque chaine de
caractère. J'appelle ceci la suppression des colonnes.
Par exemple dans notre cas, nous allons supprimer les 0 dans la
position 4 et 6 de chaque chaine car dans cette position nous avons
toutes les chaines ont un 0 dans la position 4 et 6.

j'ai trouvé une difficulté de résoudre ce problème, de plus imagine z
si nous avons un fichier volumineux (donc c'est couteux d'utiliser une
autre structure en mémoire pour faire des traitements nécessaires).

Mon idée:

1) Pour la suppression des lignes: je parcoure ligne par ligne et je
vérifie c'est la chaine de cette ligne est égale au "0000000" alors je
supprime cette ligne.
Comment je vais supprimer cette ligne ? Et après la suppression, est
ce qu'il reste une ligne vide(comme une entrée) ? Si oui, comment je
éviter cette ligne vide

2) Pour la suppression des colonnes: Je parcoure seulement la première
ligne de fichier. Pour tout 0 de chaine de première ligne je teste si
je trouve dans position p un 0 dans la chaine du première ligne alors
je vérifie si je trouve 0 dans la même position p dans les chaines des
autres lignes.
Cette solution este théorique. Imaginez si nous avons un fichier
volumineux.De plus, comment je vais déplacer dans le fichier dans la
bonne position ?

A la fin, je ne dois pas obtenir un résultat comme çà :
10 11101
20 10110
30 01011

40 10011

80 11101
100 10101

Mais, Le résultat voulu est( dans le même fichier ou autre fichier) :

essai.txt:

10 11101
20 10110
30 01011
40 10011
80 11101
100 10101


S'il vous plait, j'ai besoin de vos aides.
Merci.
Avatar
Christian ASTOR
Rim msedi wrote:

Je reformule ma demande.



Tu lis les réponses des fois ?
Qu'est-ce que tu n'as pas compris dans le code (vraiment simpliste) que
j'ai posté ?
Avatar
Rim msedi
On 18 juil, 09:03, Christian ASTOR wrote:
Rim msedi wrote:
> Je reformule ma demande.

Tu lis les réponses des fois ?
Qu'est-ce que tu n'as pas compris dans le code (vraiment simpliste) que
j'ai posté ?



Salut,

J'ai remarqué que la libraire "iostream.h" n'existe pas dans les
fichiers include de Visual studio 2008.

Voici mon code C++ de test :
#include <iostream.h>
#include<stdio.h>

int main()
{
FILE * fp_con;
cout << "Hello world!";
fp_con = fopen("contexte.xls","r+");
if(!fp_con)
{
cout<<"erreur lors de l'ouverture du fichier";
getch();
exit(0);
}

return 0;
}

Après la compilation, j'ai ce message:

1>------ Début de la génération : Projet : stoph, Configuration  :
Debug Win32 ------
1>Compilation en cours...
1>main.c
1>c:stophstophmain.c(1) : fatal error C1083: Impossible d'ouvrir le
fichier include : 'iostream.h' : No such file or directory
1>Le journal de génération a été enregistré à l'emplacement "fi le://c:
stophstophDebugBuildLog.htm"
1>stoph - 1 erreur(s), 0 avertissement(s)
========== Génération : 0 a réussi, 1 a échou é, 0 mis à jour, 0 a été
ignoré ==========

Je ne sais pas quelle librairie qui va remplacer la libraire standard
"iostream.h" ?

Merci.
Avatar
Christian ASTOR
Rim msedi wrote:

> J'ai remarqué que la libraire "iostream.h" n'existe pas

Relis le code. Jamais je n'ai mis ça.
Avatar
Rim msedi
On 18 juil, 09:54, Christian ASTOR wrote:
Rim msedi wrote:

  > J'ai remarqué que la libraire "iostream.h" n'existe pas

Relis le code. Jamais je n'ai mis ça.



Salut,

J'ai testé le code suivant:
#include <tchar.h>
#include <iostream>

#define MAXLINE 1024

int _tmain(int argc, _TCHAR* argv[])
{
char sLine[MAXLINE];
char sNum[10], sAttrib[32];
FILE *pFile, *pFileOut;
pFile = fopen("test.txt","r");
pFileOut = fopen("test2.txt","w");
if (pFile && pFileOut)
{
while (fgets(sLine, MAXLINE, pFile))
{
strncpy(sNum, sLine, 5);
sNum[5] = '';
strncpy(sAttrib, &sLine[5], 6);
sAttrib[6] = '';
if (strcmp(sAttrib, "000000") != 0)
fprintf(pFileOut, "%s%sn", sNum,
sAttrib);
}
fclose(pFile);
fclose(pFileOut);
}
return 0;

}


Après la compilation, j'ai le message suivant portant les 4 warrings :

1>------ Début de la génération : Projet : amani, Configuration  :
Debug Win32 ------
1>Compilation en cours...
1>main.cpp
1>c:amaniamanimain.cpp(11) : warning C4996: 'fopen': This function
or variable may be unsafe. Consider using fopen_s instead. To disable
deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.
1> c:program filesmicrosoft visual studio 9.0vcinclude
stdio.h(237) : voir la déclaration de 'fopen'
1>c:amaniamanimain.cpp(12) : warning C4996: 'fopen': This function
or variable may be unsafe. Consider using fopen_s instead. To disable
deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.
1> c:program filesmicrosoft visual studio 9.0vcinclude
stdio.h(237) : voir la déclaration de 'fopen'
1>c:amaniamanimain.cpp(17) : warning C4996: 'strncpy': This
function or variable may be unsafe. Consider using strncpy_s instead.
To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help
for details.
1> c:program filesmicrosoft visual studio 9.0vcinclude
string.h(157) : voir la déclaration de 'strncpy'
1>c:amaniamanimain.cpp(19) : warning C4996: 'strncpy': This
function or variable may be unsafe. Consider using strncpy_s instead.
To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help
for details.
1> c:program filesmicrosoft visual studio 9.0vcinclude
string.h(157) : voir la déclaration de 'strncpy'
1>Édition des liens en cours...
1>Incorporation du manifeste en cours...
1>Le journal de génération a été enregistré à l'emplacement "fi le://c:
amaniamaniDebugBuildLog.htm"
1>amani - 0 erreur(s), 4 avertissement(s)
========== Génération : 1 a réussi, 0 a échou é, 0 mis à jour, 0 a été
ignoré ==========

Vous avez dit que ce code permet de supprimer du fichier test.txt des
lignes qui contient comme
chaine caractere "000000"

si on a le fichier d'entrée test.txt :

1 110101
2 100101
3 110101
4 000101
5 000000
6 110101
7 110101
8 000000
9 010101
10 100101
Après l'exécution ce votre code, on aura le fichier test2.txt :
1 110101
2 100101
3 110101
4 000101
5 000000
6 110101
7 110101
8 000000
9 010101
10 100101

C'est le même fichier. Ce n'est pas çà ? Vous n'avez pas supprimé l es
deux lignes portant comme chaine "000000" ?

5 000000
8 000000
Avatar
Rim msedi
On 18 juil, 09:54, Christian ASTOR wrote:
Rim msedi wrote:

  > J'ai remarqué que la libraire "iostream.h" n'existe pas

Relis le code. Jamais je n'ai mis ça.




Salut,

Quelle est la différence entre main et _tmain ?
Quelle est la différence entre strncpy() et strcpy() ?
Quelle est la différence entre char et -TCHAR ?
Quelle est le rôle du _TCHAR et tchar.h ?

C'est vraie que chaque ligne contient deux champs:
- un objet qui est présenté par un entier
- un attribut qui est présenté par une chaine de caractère.

De plus, On a tous les attributs ont la même taille. Mais, cette
taille n'est pas fixée en avance car ceci dépend d'exemple. Comment on
peut automatiser les instructions suivantes : ?

sNum[5] = ''; comment vous savez en avance que sNum est de taille
5 ?

De plus, sNum est un entier (présentant le premier champ de chaque
ligne) et n'est pas une chaine de caractère ?
Or, vous mettez dans votre code : char sNum[10]

strncpy(sAttrib, &sLine[5], 6); signifie quoi cette instruction ?

sAttrib[6] = ''; pourquoi cette instruction ?

if (strcmp(sAttrib, "000000 ") != 0) signifie quoi cette
instruction ? De plus, on n' a pas toujours "000000" çà dépend de
l'exemple


Merci.
Avatar
Christian ASTOR
Rim msedi wrote:

C'est le même fichier. Ce n'est pas çà ? Vous n'avez pas supprimé les
deux lignes portant comme chaine "000000" ?

5 000000
8 000000



Mais si, le fichier test2.txt sera :

1 110101
2 100101
3 110101
4 000101
6 110101
7 110101
9 010101
10 100101

(si le fichier test.txt a le format défini au départ bien sûr...)
Avatar
Rim msedi
On 18 juil, 11:10, Christian ASTOR wrote:
Rim msedi wrote:
> C'est le même fichier. Ce n'est pas çà ? Vous n'avez pas supprim é les
> deux lignes portant comme chaine "000000" ?

> 5    000000
> 8    000000

Mais si, le fichier test2.txt sera :

1    110101
2    100101
3    110101
4    000101
6    110101
7    110101
9    010101
10   100101

(si le fichier test.txt a le format défini au départ bien sûr...)




Salut,

Après la compilation du votre programme , j'ai des warrings qui
peuvent être la cause à ne pas obtenir le même résultat que vous ?

Avez-vous les warrings suivants ?
1>------ Début de la génération : Projet : amani, Configuration  :
Debug Win32 ------
1>Compilation en cours...
1>main.cpp
1>c:amaniamanimain.cpp(11) : warning C4996: 'fopen': This function
or variable may be unsafe. Consider using fopen_s instead. To disable
deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.
1> c:program filesmicrosoft visual studio 9.0vcinclude
stdio.h(237) : voir la déclaration de 'fopen'
1>c:amaniamanimain.cpp(12) : warning C4996: 'fopen': This function
or variable may be unsafe. Consider using fopen_s instead. To disable
deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.
1> c:program filesmicrosoft visual studio 9.0vcinclude
stdio.h(237) : voir la déclaration de 'fopen'
1>c:amaniamanimain.cpp(17) : warning C4996: 'strncpy': This
function or variable may be unsafe. Consider using strncpy_s instead.
To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help
for details.
1> c:program filesmicrosoft visual studio 9.0vcinclude
string.h(157) : voir la déclaration de 'strncpy'
1>c:amaniamanimain.cpp(19) : warning C4996: 'strncpy': This
function or variable may be unsafe. Consider using strncpy_s instead.
To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help
for details.
1> c:program filesmicrosoft visual studio 9.0vcinclude
string.h(157) : voir la déclaration de 'strncpy'
1>Édition des liens en cours...
1>Incorporation du manifeste en cours...
1>Le journal de génération a été enregistré à l'emplacement "fi le://c:
amaniamaniDebugBuildLog.htm"
1>amani - 0 erreur(s), 4 avertissement(s)
========== Génération : 1 a réussi, 0 a échou é, 0 mis à jour, 0 a été
ignoré ==========

voici le même fichier d'input test.txt :

1 110101
2 100101
3 110101
4 000101
5 000000
6 110101
7 110101
8 000000
9 010101
10 100101

Après l'exécution, j'ai le fichier test2.txt:
1 110101
2 100101
3 110101
4 000101
5 000000
6 110101
7 110101
8 000000
9 010101
10 100101


C'est le même ! rien à changer. Si nous corrigeons les warrings alors
nous pouvons obtenir le même résultat.

J'ai quelques questions :

Quelle est la différence entre main et _tmain ?
Quelle est la différence entre strncpy() et strcpy() ?
Quelle est la différence entre char et -TCHAR ?
Quelle est le rôle du _TCHAR et tchar.h ?

C'est vraie que chaque ligne contient deux champs:
- un objet qui est présenté par un entier
- un attribut qui est présenté par une chaine de caractère.

De plus, On a tous les attributs ont la même taille. Mais, cette
taille n'est pas fixée en avance car ceci dépend d'exemple. Comment on
peut automatiser les instructions suivantes : ?

sNum[5] = ''; comment vous savez en avance que sNum est de taille
5 ?

De plus, sNum est un entier (présentant le premier champ de chaque
ligne) et n'est pas une chaine de caractère ?
Or, vous mettez dans votre code : char sNum[10]

strncpy(sAttrib, &sLine[5], 6); signifie quoi cette instruction ?

sAttrib[6] = ''; pourquoi cette instruction ?

if (strcmp(sAttrib, "000000 ") != 0) signifie quoi cette
instruction ? De plus, on n' a pas toujours "000000" çà dépend de
l'exemple

Merci.
1 2