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
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
A voir également:
- Les Fichiers
- Wetransfer gratuit fichiers lourd - Guide
- Renommer plusieurs fichiers en même temps - Guide
- Explorateur de fichiers - Guide
- Fichiers epub - Guide
- Fichiers bin - Guide
2 réponses
mamiemando
Messages postés
33535
Date d'inscription
jeudi 12 mai 2005
Statut
Modérateur
Dernière intervention
12 février 2025
7 828
Modifié le 14 juin 2018 à 10:35
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
Ensuite pour revenir à ta question tu ne peux pas faire beaucoup mieux. Supposons qu'on ne veuille pas mémoriser le contenu de
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
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::splitcomme 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
f2ou
f3. Cela oblige à lire le fichier
f1pour avoir cette information. Ensuite il faudrait être capable de lire
f1dans 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
fseekmais 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
[Dal]
Messages postés
6203
Date d'inscription
mercredi 15 septembre 2004
Statut
Contributeur
Dernière intervention
29 janvier 2025
1 099
16 juin 2018 à 16:06
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
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
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
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
[Dal]
Messages postés
6203
Date d'inscription
mercredi 15 septembre 2004
Statut
Contributeur
Dernière intervention
29 janvier 2025
1 099
18 juin 2018 à 10:46
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.
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.
23 juin 2018 à 07:53
Merci en tout cas .