gestion de Grand Nombre - C++ - Programmation
Marsh Posté le 08-11-2002 à 23:50:44
Taz@PPC a écrit a écrit : apprends l'approche objet et apres on verra |
ben alors je repasserai dans 6 mois
Marsh Posté le 09-11-2002 à 09:16:50
Une méthode "basique" consiste à chercher dans le fichier les CrLf qui sont les caractères de fin de ligne (ou Cr ou Lf seul si Mac ou Unix (en désordre)).
Quand on trouve une séquence CrLf, c'est qu'on atteint la ligne suivante, on peut alors compter les caractères dans la nouvelle ligne.
Si on explore ce fichier une première fois, on peut remplir un tableau d'index des débuts de ligne (PosDebLigne[] ds l'exemple). Quand on veut trouver qq chose, on utilise la chaîne qui commence en PosDebLigne[NumLign - 1] + NumDuCaractDansLaLigne
Ca laisse le temps d'apprendre la POO.
Marsh Posté le 09-11-2002 à 09:21:26
http://www.swox.com/gmp/
pourquoi réinventer la roue en la faisant carrée ?
Marsh Posté le 09-11-2002 à 10:03:09
carbon_14 a écrit a écrit : Une méthode "basique" consiste à chercher dans le fichier les CrLf qui sont les caractères de fin de ligne (ou Cr ou Lf seul si Mac ou Unix (en désordre)). Quand on trouve une séquence CrLf, c'est qu'on atteint la ligne suivante, on peut alors compter les caractères dans la nouvelle ligne. Si on explore ce fichier une première fois, on peut remplir un tableau d'index des débuts de ligne (PosDebLigne[] ds l'exemple). Quand on veut trouver qq chose, on utilise la chaîne qui commence en PosDebLigne[NumLign - 1] + NumDuCaractDansLaLigne Ca laisse le temps d'apprendre la POO. |
vu tes connaissances, le mieux est de charger tout le fichier en mémoire, ca sera plus simple.
Code :
|
edit : CrLF n'existe po, parcontre '\n'
Marsh Posté le 09-11-2002 à 10:59:46
Oui, je me suis laissé glisser en ASCII (en lecture de fichier linux, on est bien content).
Le chargement du fichier en mémoire est idéal quand pas trop énorme, car ça va vite ensuite, et on peut faire ce qu'on veut, autant de fois qu'il faut sans soucis. J'avais pas précisé .
C'est la méthode que j'utilise pour des fichiers binaires de spectros (très rapide sur vieux 33MHz), recherche ensuite des séquences spécifiques...
Le C++, j'arrive pas non plus à trouver du temps à m'y initier (l'âge aussi...). Suis resté page 20 de mon bouquin. Y a des urgences qui se bousculent . Ce sera pour la retraite.
Marsh Posté le 09-11-2002 à 11:04:35
carbon_14 a écrit a écrit : Oui, je me suis laissé glisser en ASCII (en lecture de fichier linux, on est bien content). Le chargement du fichier en mémoire est idéal quand pas trop énorme, car ça va vite ensuite, et on peut faire ce qu'on veut, autant de fois qu'il faut sans soucis. J'avais pas précisé . C'est la méthode que j'utilise pour des fichiers binaires de spectros (très rapide sur vieux 33MHz), recherche ensuite des séquences spécifiques... Le C++, j'arrive pas non plus à trouver du temps à m'y initier (l'âge aussi...). Suis resté page 20 de mon bouquin. Y a des urgences qui se bousculent . Ce sera pour la retraite. |
mais on fait du C++ ou du C?
et puis le chargement en mémoire d'un fichier texte ... meme s'ilf ait 10Mo, ca vaut le coup.
sinon si le problème est sous linux, y a encore mieux avec mmap
Marsh Posté le 09-11-2002 à 11:10:18
C ou C++, faut demander à reglisse.
DOS, Win ou Nunux ?
Up !
Marsh Posté le 09-11-2002 à 11:24:57
ben je suis en C++ et windows avec Dev C++
moi je comprend pourquoi on peut pas lire le eme caractere dans un fichier txt
par exemple 1hf5hyu4y5uh52f5s
par comment simplement afficher le 5éme soit h ici ?
Marsh Posté le 09-11-2002 à 11:26:49
Taz@PPC a écrit a écrit : mais on fait du C++ ou du C? et puis le chargement en mémoire d'un fichier texte ... meme s'ilf ait 10Mo, ca vaut le coup. sinon si le problème est sous linux, y a encore mieux avec mmap |
vraiment ?
Marsh Posté le 09-11-2002 à 11:28:17
je connais pas vraiment C++, mais il doit surement exister un equivalent a fseek() avec les flux, non ?
Marsh Posté le 09-11-2002 à 11:33:20
lorill a écrit a écrit : je connais pas vraiment C++, mais il doit surement exister un equivalent a fseek() avec les flux, non ? |
ben oui mais j'arrive pas
Marsh Posté le 09-11-2002 à 11:33:34
Oui, il y a l'opération seek() qui fonctionne exactement comme fseek(), mais ca ne marche que sur les flux "seekable" bien sur, et cin/cout le sont rarement
Marsh Posté le 09-11-2002 à 15:59:16
reglisse a écrit a écrit : vraiment ? |
On n'accède qu'une fois au fichier, et après ça va très vite. On peut faire tout ce qu'on veut.
Si le fichier fait 100 ou 1000Mo, faut charger que des bouts (de 10Mo ), genre "fenêtrage".
Marsh Posté le 09-11-2002 à 17:32:04
carbon_14 a écrit a écrit : On n'accède qu'une fois au fichier, et après ça va très vite. On peut faire tout ce qu'on veut. Si le fichier fait 100 ou 1000Mo, faut charger que des bouts (de 10Mo ), genre "fenêtrage". |
mais 10go en mémoire c impossible non ?
Marsh Posté le 09-11-2002 à 17:35:02
reglisse a écrit a écrit : mais 10go en mémoire c impossible non ? |
si t'as 20go de mémoire, ca passe
Marsh Posté le 09-11-2002 à 18:52:51
bon ça marche avec des tableua je multiplie de nombre de 9 chifres ça donne le resultat exacte mais au bout de 3 min
j'ose pas passé à dix
Marsh Posté le 09-11-2002 à 21:31:49
mais tu dois absolument faire ta propre implémentation de la gestion des grands nombres, ou tu peux en utiliser une existante ?
pourquoi tu t'obstines a faire un truc qui sera forcément moins bien que ce qui existe ?
Marsh Posté le 09-11-2002 à 23:09:03
lorill a écrit a écrit : mais tu dois absolument faire ta propre implémentation de la gestion des grands nombres, ou tu peux en utiliser une existante ? pourquoi tu t'obstines a faire un truc qui sera forcément moins bien que ce qui existe ? |
ben si je savais ou trouver une je le ferai pas mais bon comme je sais pas en trouver une j'en fais une je crois que je suis limiter par les long
Marsh Posté le 10-11-2002 à 01:32:30
Il y a un vieux et très bon topic sur les grands nombre.
http://forum.hardware.fr/forum2.php3?post=29&cat=10bistromatique, grands nombres et opérations optimisées, évaluation d'expressions, arbre, pile
Marsh Posté le 10-11-2002 à 11:06:43
bon ok tout est bien expliqué mais bon je vais terminer me reste la division et corriger la multiplication ya un tuc qui depasse le long
Marsh Posté le 10-11-2002 à 13:48:39
Taz@PPC a écrit a écrit : sinon si le problème est sous linux, y a encore mieux avec mmap |
est ce que l'API C de windows propose une fonction similaire à mmap qui permette une projection de fichier en mémoire?
Marsh Posté le 10-11-2002 à 13:54:29
Oui, elle le permet. Mais faudra aller chercher dans la MSDN pour ça.
Marsh Posté le 10-11-2002 à 16:46:01
bon ben j'ai un autre probleme quand je depasse 1600 chiffres environ ça bug
sinon comment faire une fonction qui lit un fichier texte comme ça :
123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789
et qui range les chiffres dans un tableau int genre tab[i]=ni ?
Marsh Posté le 10-11-2002 à 16:58:03
reglisse a écrit a écrit : ben si je savais ou trouver une je le ferai pas mais bon comme je sais pas en trouver une j'en fais une je crois que je suis limiter par les long |
tu te fous de moi ?
6eme message du topic :
Citation : |
Marsh Posté le 10-11-2002 à 17:25:20
lorill a écrit a écrit : tu te fous de moi ? 6eme message du topic :
|
Ben oui j'ai vu mais je sais pas comment m'en servir et puis c oussi un pretexte pour apprendre le c++
Marsh Posté le 10-11-2002 à 17:26:29
reglisse a écrit a écrit : bon ben j'ai un autre probleme quand je depasse 1600 chiffres environ ça bug sinon comment faire une fonction qui lit un fichier texte comme ça : 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 et qui range les chiffres dans un tableau int genre tab[i]=ni ? |
j'ai fais ça mais la fonction lire j'arrive pas
Code :
|
Marsh Posté le 10-11-2002 à 17:27:54
reglisse a écrit a écrit : Ben oui j'ai vu mais je sais pas comment m'en servir |
t'es pas capable d'utiliser un truc dont l'interface est pas vraiment compliquée, et tu veux recrééer l'equivalent ?
Marsh Posté le 10-11-2002 à 17:31:24
ça donne ça comme fichier sur des petits nombres de 89 chiffres de 9 multiplier pas lui même ( au carré quoi ) les zeros c parce que c des tableaux de 180 chifres en base 10 bien sur
000000000 000000000 000000000 000000000 000000000
000000000 000000000 000000000 000000000 000000000
099999999 999999999 999999999 999999999 999999999
999999999 999999999 999999999 999999999 999999999
×
000000000 000000000 000000000 000000000 000000000
000000000 000000000 000000000 000000000 000000000
099999999 999999999 999999999 999999999 999999999
999999999 999999999 999999999 999999999 999999999
=
009999999 999999999 999999999 999999999 999999999
999999999 999999999 999999999 999999999 999999999
800000000 000000000 000000000 000000000 000000000
000000000 000000000 000000000 000000000 000000001
Marsh Posté le 10-11-2002 à 17:35:07
lorill a écrit a écrit : t'es pas capable d'utiliser un truc dont l'interface est pas vraiment compliquée, et tu veux recrééer l'equivalent ? |
ben oui j'ai donwloader le gmp-4.1 mais j'ai rien compris et puis c un pretexte pour apprendre
Marsh Posté le 11-11-2002 à 03:53:33
reglisse a écrit a écrit : j'ai fais ça mais la fonction lire j'arrive pas |
N'ouvres le fichier qu'une fois, et transmet le FILE* à la fonction.
Comme ça, tu peux transmettre stdout/stdin pour faire des test console rapides.
Utilises "%lu" comme format pour unsigned long.
Code :
|
Marsh Posté le 08-11-2002 à 23:02:57
je souhaite faire un programme afin de gerer des trés grands nombres ( plusieurs milliers de chiffres voir plus )
je souhaite les gérer par fichiers txt
j'aimerais pour voir lire parmis un fichiers de n lignes de x chiffres un chifres precis par exemple le 10éme de la 15éme ligne
comment puis m'y prendre pour l'instant j'arrive à lire les tableau en entier c tout