Les Fichiers

Fermé
MonCplusplus Messages postés 21 Date d'inscription lundi 23 avril 2018 Statut Membre Dernière intervention 9 mars 2019 - 2 juin 2018 à 21:54
MonCplusplus Messages postés 21 Date d'inscription lundi 23 avril 2018 Statut Membre Dernière intervention 9 mars 2019 - 23 juin 2018 à 07:53
Bonjour , voilà je suis sur un algorithme qui consiste à remplir des blocs de 10 entiers dans premier fichier nommé f1 . Une fois le fichier f1 rempli supposons que nous ayons : 1,2,3 ... 10, mon fichier f1 présente bien un bloc de 10 entiers par conséquent j'essaie de remplir ces 10 entiers dans un autre fichier nommé f2 mais en les inversant , donc dans mon fichier f2 il faut que j'ai : 10,9,8,7 ... 1. Cependant l'accès aux donné dans un fichier étant séquentiel , je n'ai d'autre choix que de stocké les valeurs inversé dans un tableau.Dans le cas ou j'ai un bloc incomplet je dois insérer les entiers dans un fichier nommé f3. supposons que j'avais au départ 5 entiers dans mon fichier f1: 1,5,3,2,4 il faut que je les inverse également et que j'ai dans mon fichier f3: 4,2,3,5,1 .

Cependant je trouves mon algorithme un peu "absurde" lorsque je dois inverser les bloc quelqu'un a une meilleur proposition .

Voici mon code "simplifier " avec une procédure qui rempli mes fichier f2 , f3 selon le bloc d'entiers qui n'est rien d'autre que ma dimension de mon tableau.

int main(){
FILE *f1,*f2,*f3;
int tab[30],dim; // dim représente la taille logique de mon tableaux (le nombre d'éléments).
remplirbloc(tab,dim,f2,f3);

}


void remplirbloc(int tab[],int dim,FILE* file1,FILE* file2){
int i = 1;

while(((dim-i)%10!=0) && i <= dim){
fwrite(&tab[dim-i],sizeof(tab[dim-i]),1,file2);
i++;
}
fwrite(&tab[dim-i],sizeof(tab[dim-i]),1,file2);
i++;

while(i<=dim){
fwrite(&tab[dim-i],sizeof(tab[dim-i]),1,file1);
i++;
}
fclose(file1);
fclose(file2);
}


Merci d'avance pour vos intervention ! .
A voir également:

2 réponses

mamiemando Messages postés 33079 Date d'inscription jeudi 12 mai 2005 Statut Modérateur Dernière intervention 23 avril 2024 7 749
Modifié le 14 juin 2018 à 10:35
Bonjour,

Mise à part que l'indentation peut être amélioré, que c'est programmé en C plutôt qu'en C++, et que dim n'est pas initialisé, tu ne peux pas faire beaucoup mieux.

Le programme s'écrit plus facilement en C++ en s'appuyant sur des std::istream_iterator.

À noter aussi qu'il existe d'autre manière d'écrire ce programme, par des fonctions en utilisant
boost::split
comme illustré ici, ou la recoder.

Ensuite pour revenir à ta question tu ne peux pas faire beaucoup mieux. Supposons qu'on ne veuille pas mémoriser le contenu de
f1
. Dans ce cas il faut savoir si on doit écrire dans
f2
ou
f3
. Cela oblige à lire le fichier
f1
pour avoir cette information. Ensuite il faudrait être capable de lire
f1
dans l'ordre inverse pour écrire nombre par nombre la valeur adéquate dans le fichier de sortie. Or apparemment il n'y a pas de "istream_reverse_iterator". Note que lire le fichier "à l'envers" serait faisable avec
fseek
mais engendrerait un programme indigeste.

Pour résumer, à moins que f1 soit absolument énorme et ne puisse pas tenir en mémoire (ce qui ne semble pas être ton cas), le jeu n'en vaut pas la chandelle. Quelle que la solution retenue, le coup en mémoire et le temps d'exécution seront négligeable dans tous les cas pour une liste de 10 entiers.

Bonne chance
0
MonCplusplus Messages postés 21 Date d'inscription lundi 23 avril 2018 Statut Membre Dernière intervention 9 mars 2019
23 juin 2018 à 07:53
Bonjour , merci pour ton intervention . J'ai effectivement omis le fait de mentionner que c'était un code partiel et que par conséquent on ne voit les brides de code en C++ . En ce qui concerne l'utilisation d'un fichier mes includes sont effectivement en C . Etant encore étudiant et que c'est destiné à travaillé l'algorithme , les appels de "méthodes " notamment pour l'iterateur ne sont pas accepter .

Merci en tout cas .
0
[Dal] Messages postés 6174 Date d'inscription mercredi 15 septembre 2004 Statut Contributeur Dernière intervention 2 février 2024 1 083
16 juin 2018 à 16:06
Salut MonCplusplus,

Effectivement, comme le dit mamiemando, ton code est du C et pas du C++.

Cependant, à mon sens, ta fonction ne fait pas ce que tu dis qu'elle est sensée faire.

Elle se contente d'écrire les entiers du tableau dans l'ordre inverse dans le même fichier (file2 dans ta fonction), que dim soit égal à 10 ou pas.

Le code en lignes 19 et suivantes n'est jamais exécuté car à ce stade, i est déjà nécessairement supérieur à dim.

Le mod dans le while
((dim - i) % 10 !=0)
ne sert à rien si les entiers à gauche de l'opérande sont toujours entre 9 et 0, car le résultat de la division entière par 10 sera alors toujours identique à l'opérande de gauche, donc tu peux juste écrire
dim - i != 0
.

Si ta fonction doit vraiment écrire dans des fichiers différents selon que dim est ou non égal à 10, tu dois commencer par faire ce test. Ensuite, tu peux très bien utiliser une seule et même boucle, juste en affectant, après ton test, file1 ou file2 selon le cas à un pointeur sur FILE que tu peux déclarer dans ta fonction pour le passer à fwrite.

Aussi, puisque le prototype de ta fonction précise bien que les éléments du tableau sont tous des int, ton code serait plus lisible si au lieu de faire
sizeof(tab[dim-i])
tu faisais juste
sizeof int
...

Note aussi que, contrairement à ce que tu dis, tu n'écris à aucun moment dans un autre fichier dans l'ordre du tableau... mais c'est peut-être dû au fait que tu nous présentes un code partiel. Si c'est le cas, tu aurais aussi bien pu ne pas mentionner cette information, car cela rend ta question très confuse.

Enfin, je trouve bizarre de fermer les fichiers dans ta fonction, alors qu'ils sont ouverts ailleurs, ou même qu'ils soient ouverts ailleurs. En fait, je ne comprends pas la logique du passage des pointeurs sur FILE puisqu'à ce stade deux fichiers seraient déjà ouverts en écriture, alors que l'ouverture de l'un d'eux serait inutile par définition... Il y a un problème de logique là dedans, je crois.


Dal
0
[Dal] Messages postés 6174 Date d'inscription mercredi 15 septembre 2004 Statut Contributeur Dernière intervention 2 février 2024 1 083
18 juin 2018 à 10:46
aussi, le code ne fait pas non plus de stockage d'une copie du tableau inversé (ce que tu sembles évoquer dans ton message d'origine), ce qui permettrait de faire un seul fwrite (et d'éliminer la boucle)...

Cela dit, pour créer le tableau inverse, il faudrait un malloc (et le free) et une boucle pour faire la copie, alors .... si on ne va vraiment seulement écrire que 10 éléments au plus et que c'est une seule fois qu'on doit le faire, faire 10 fwrite chacun de la taille d'un int au lieu d'un seul pour 10 int ne doit pas encore être trop pénalisant en temps d'exécution.
0