Partage
  • Partager sur Facebook
  • Partager sur Twitter

libc++abi.dylib

Abort trap: 6

    12 juin 2021 à 12:31:08

    Bonjour, j'ai un erreur ci dessus je ne comprends pas pourquoi il y a cette erreur .

    voilà mon code:

    open.h:

    #ifndef OPEN_H
    #define OPEN_H
    #include <iostream>
    #include <string>
    #include <fstream>
    using namespace std;
    
    class OPEN {
    public:
    	OPEN(string file_c, char m);
    	string read(int nb);
    	string read();
    	string readline();
    	string nbWords();
    	void write();
    private:
    	char mode;
    	string n_file;
    	ofstream file_w;
    	ifstream file_r;
    
    
    };
    
    
    
    OPEN::OPEN(string file_c, char m) {
    	n_file = file_c;
    	mode = m;
    	if(m == 'w') {
    		ofstream file_w(file_c.c_str());
    		if(! file_w) {
    			goto error;
    		}
    
    	}
    	if(m == 'r') {
    		ifstream file_r(file_c.c_str());
    
    		if(! file_r) {
    			goto error;
    		}
    	}
    
    	error:
    		throw string("ERREUR: UNE ERREUR EST PARVENU");
    	
    }
    
    string OPEN::read() {
    	if(mode != 'r') {
    		throw string("ERREUR: vous n'êtes pas en mode lecture");
    	}
    	string body;
    	string line;
    
    
    	while(getline(file_r, line)) {
    		body += line + "\n";
    	}
    
    	return body;
    }
    
    string OPEN::readline() {
    	if(mode != 'r') {
    		throw string("ERREUR: vous n'êtes pas en mode lecture");
    	}
    
    	static string line = " ";
    	if(getline(file_r, line)){}
    	else {
    		line = "";
    		cout << "INFO: vous ne pouvez plus lire: vous êtes à la fin du fichier\n" <<endl;
    	}
    	return line;
    }
    
    
    #endif



    open_test.cpp:

    #include "open.h"
    using namespace std;
    
    int main(int argc, char const *argv[])
    {
    	OPEN n("test_open.rft", 'r');
    	cout<<n.read() <<endl;
    	return 0;
    }

    pouvez vous m'expliquer pourquoi il y cette erreur



    -
    Edité par TheSmiley 12 juin 2021 à 13:30:42

    • Partager sur Facebook
    • Partager sur Twitter
      12 juin 2021 à 14:37:54

      Bonjour,

      Tu déclares deux fois file_r, donc tu as deux variables file_r:

      • Dans les variables membres, en private (ifstream file_r;)
      • Dans le constructeur de OPEND (ifstream file_r(file_c.c_str());)(Variable local, perdu à la sortie du constructeur !)

      Donc quand tu appelles read, la variable membre file_r n'est pas initialisée.

      Cordialement

      -
      Edité par Dedeun 12 juin 2021 à 14:38:20

      • Partager sur Facebook
      • Partager sur Twitter
        12 juin 2021 à 15:07:18

        j'ai compris mais comment faire pour initialiser un objet attribut dans une classe

        s'il vous plait AIDEZ - MOI

        -
        Edité par TheSmiley 12 juin 2021 à 15:37:10

        • Partager sur Facebook
        • Partager sur Twitter
          12 juin 2021 à 19:11:09

          Bonjour, quand tu veux utiliser un attribut d'une classe dans une fonction membre, il ne faut pas commencer la ligne d'instruction par le type, autrement, c'est une nouvelle déclaration.

          Tu dois juste écrire :

          if(m == 'r') {
                  file_r.open(file_c.c_str());
           
                  if(! file_r) {
                      goto error;
                  }
              }

          Pour répondre à ta question, le mieux est d'utiliser une liste d'initialisation. Comme cela par exemple :

          #include <string>
          
          struct A
          {
          	A(int const _i, char const _c, std::string const& _s);
          	int i;
          	char c;
          	std::string s;
          
          }
          
          A::A(int const _i, char const _c, std::string const& _s)
          : i(_i), c(_c), s(_s) //exemple de liste d'initialisation
          {}

          Mais il faudrait revoir l'architecture de ton code pour cela. Dans ce contexte, je ne pense pas qu'il soit judicieux que la même classe lise et écrive...

          De plus, je te conseille :

          1) de ne pas utiliser

          using namespace std;

          Cela risque vite de te créer des conflits avec des bibliothèques tierces ou tes propres classes.

          2) de ne pas utiliser de goto
          3) de déclarer constant tout ce qui n'est pas sensé être modifié (comme dans mon exemple).
          4) de passer par référence tout ce qui est plus gros qu'un type de base (comme dans mon exemple).

          Enfin je pense que tu te prends la tête pour pas grand chose. Si le but c'est juste de lire un fichier en entier ou ligne à ligne tu n'as pas besoin de tout ça. Je te conseille de lire :

          https://zestedesavoir.com/tutoriels/822/la-programmation-en-c-moderne/le-debut-du-voyage/mais-ou-sont-mes-fichiers/#3-std-ifstream-lire-dans-un-fichier

          -
          Edité par Umbre37 12 juin 2021 à 19:34:51

          • Partager sur Facebook
          • Partager sur Twitter
            12 juin 2021 à 20:48:49

            bonsoir, j'ai changé comme tu l'as dit mais

            /Library/Developer/CommandLineTools/usr/include/c++/v1/streambuf:490:64: error:base class 'std::__1::ios_base' has private copy constructor


            pourquoi?

            • Partager sur Facebook
            • Partager sur Twitter
              12 juin 2021 à 22:23:29

              AntoineBarbier12 a écrit:

              bonsoir, j'ai changé comme tu l'as dit mais

              /Library/Developer/CommandLineTools/usr/include/c++/v1/streambuf:490:64: error:base class 'std::__1::ios_base' has private copy constructor


              pourquoi?


              ok, peux-tu me montrer ton nouveau code ?
              • Partager sur Facebook
              • Partager sur Twitter
                13 juin 2021 à 8:37:54

                voilà le code:

                #ifndef OPEN_H
                #define OPEN_H
                #include <iostream>
                #include <string>
                #include <fstream>
                
                
                std::ofstream init_of(std::string file);
                std::ifstream init_if(std::string file);
                
                
                
                class OPEN {
                public:
                	OPEN(std::string file_c);
                	std::string read(int nb);
                	std::string read();
                	std::string readline();
                	std::string nbWords();
                	void write();
                private:
                	std::string n_file;
                	std::ofstream file_w;
                	std::ifstream file_r;
                
                
                };
                
                
                
                OPEN::OPEN(std::string file_c) : n_file(file_c){
                	file_r.open(file_c.c_str());
                	file_w.open(file_c.c_str());
                	}
                
                std::string OPEN::read() {
                	std::string body;
                	std::string line;
                
                
                	while(getline(file_r, line)) {
                		body += line;
                	}
                
                	return body;
                }
                
                std::string OPEN::readline() {
                
                	static std::string line = " ";
                	if(getline(file_r, line)){}
                	else {
                		line = "";
                		std::cout << "INFO: vous ne pouvez plus lire: vous êtes à la fin du fichier\n" <<std::endl;
                	}
                	return line;
                }
                
                std::ofstream init_of(std::string file) {
                	std::ofstream n(file.c_str());
                	return n;
                }
                
                std::ifstream init_if(std::string file) {
                	std::ifstream n(file.c_str());
                	return n;
                }
                
                #endif

                PS: j'ai remarqué que si je mettais entre commmentaire les lignes 32 et 33 l'erreur était toujours là

                -
                Edité par TheSmiley 13 juin 2021 à 9:36:53

                • Partager sur Facebook
                • Partager sur Twitter
                  13 juin 2021 à 9:48:43

                  AntoineBarbier12 a écrit:

                  voilà le code:

                  Chez moi ton code compile et fonctionne, il doit y avoir un problème ailleurs.

                  Je répète cependant :

                  1) Il faut éviter de copier des string dans tous les sens comme ça. Passe-les par référence.

                  2) Je ne comprends pas pourquoi les noms de fichier ne sont pas déclarés const...

                  3) pourquoi ne pas initialiser tes flux comme je te l'ai suggéré ?

                  OPEN::OPEN(std::string const& file_c)
                  : n_file(file_c), file_w(file_c), file_r(file_c)
                  {}

                   /!\  file_w(file_c) effacera ton fichier (après, moi, je ne sais pas ce que tu veux faire)...

                  -
                  Edité par Umbre37 13 juin 2021 à 10:00:36

                  • Partager sur Facebook
                  • Partager sur Twitter
                    13 juin 2021 à 10:08:29

                    Umbre37 a écrit:

                    AntoineBarbier12 a écrit:

                    voilà le code:

                    Chez moi ton code compile et fonctionne, il doit y avoir un problème ailleurs.

                    Je répète cependant :

                    1) Il faut éviter de copier des string dans tous les sens comme ça. Passe-les par référence.

                    2) Je ne comprends pas pourquoi les noms de fichier ne sont pas déclarés const...

                    3) pourquoi ne pas initialiser tes flux comme je te l'ai suggéré ?

                    OPEN::OPEN(std::string const& file_c)
                    : n_file(file_c), file_w(file_c), file_r(file_c)
                    {}

                     /!\  file_w(file_c) effacera ton fichier (après, moi, je ne sais pas ce que tu veux faire)...

                    -
                    Edité par Umbre37 il y a 2 minutes


                    fait mais maintenant il y a les mêmes erreurs que dans le titre
                    • Partager sur Facebook
                    • Partager sur Twitter
                      13 juin 2021 à 10:38:29

                      AntoineBarbier12 a écrit:

                      fait mais maintenant il y a les mêmes erreurs que dans le titre

                      ce que tu m'as montré fonctionne. le soucis doit venir du reste du code (du main peut-être). Montre moi un code complet, sinon je ne peux pas te dire...

                      -
                      Edité par Umbre37 13 juin 2021 à 10:39:40

                      • Partager sur Facebook
                      • Partager sur Twitter
                        13 juin 2021 à 10:51:43

                        le main:

                        #include "open.h"
                        
                        
                        int main(int argc, char const *argv[])
                        {
                        	OPEN n("test2.rft");
                        	std::cout<<n.read() << std::endl;
                        	n.close();
                        	return 0;
                        }

                        PS: j'ai rajouté close mais ce n'est pas ca qui provoque l'erreur

                        • Partager sur Facebook
                        • Partager sur Twitter
                          13 juin 2021 à 10:55:44

                          AntoineBarbier12 a écrit:

                          le main:

                          #include "open.h"
                          
                          
                          int main(int argc, char const *argv[])
                          {
                          	OPEN n("test2.rft");
                          	std::cout<<n.read() << std::endl;
                          	n.close();
                          	return 0;
                          }

                          PS: j'ai rajouté close mais ce n'est pas ca qui provoque l'erreur

                          Chez moi ce code compile en enlevant n.close()
                          Quelles sont tes options de compilation ? 



                          -
                          Edité par Umbre37 13 juin 2021 à 11:11:37

                          • Partager sur Facebook
                          • Partager sur Twitter
                            13 juin 2021 à 11:24:23

                            AntoineBarbier12 a écrit:

                            moi j'utilise g++ monfichier.cpp -o monfichier

                            Mac Os 10.13.6

                            POURQUOI CA NE MARCHE PAS CHEZ MOI

                            mon fichier test2.rft:

                            hello



                            -
                            Edité par AntoineBarbier12 il y a environ 3 heures

                            moi j'utilise g++ monfichier.cpp -o monfichier

                            Mac Os 10.13.6

                            POURQUOI CA NE MARCHE PAS CHEZ MOI

                            mon fichier test2.rft:

                            hello





                            -
                            Edité par TheSmiley 13 juin 2021 à 15:24:42

                            • Partager sur Facebook
                            • Partager sur Twitter
                              13 juin 2021 à 12:29:52

                              AntoineBarbier12 a écrit:

                              moi j'utilise g++ monfichier.cpp -o monfichier

                              ok, ajoute l'option -std=c++17 ça devrait marcher...

                              EDIT:
                              Personnellement, je mets toujours -Wall -Werror -Wextra (ça oblige à faire les choses plus proprement).

                              Et éventuellement -O2 ou -O3 pour l'optimisation.

                              -
                              Edité par Umbre37 13 juin 2021 à 12:53:34

                              • Partager sur Facebook
                              • Partager sur Twitter
                                13 juin 2021 à 12:31:56

                                Hello Antoine,

                                C'est pas la peine de crier !

                                C'est quoi tes options de compilation ? C'est quoi tes erreurs ?

                                Cordialement

                                • Partager sur Facebook
                                • Partager sur Twitter
                                  13 juin 2021 à 15:24:52

                                  Umbre37 a écrit:

                                  AntoineBarbier12 a écrit:

                                  moi j'utilise g++ monfichier.cpp -o monfichier

                                  ok, ajoute l'option -std=c++17 ça devrait marcher...

                                  EDIT:
                                  Personnellement, je mets toujours -Wall -Werror -Wextra (ça oblige à faire les choses plus proprement).

                                  Et éventuellement -O2 ou -O3 pour l'optimisation.

                                  -
                                  Edité par Umbre37 il y a environ 1 heure

                                  Ca ne marche toujours pas!!!!!:'(:'(

                                  Dedeun a écrit:

                                  Hello Antoine,

                                  C'est pas la peine de crier !

                                  C'est quoi tes options de compilation ? C'est quoi tes erreurs ?

                                  Cordialement



                                  AntoineBarbier12 a écrit:

                                  moi j'utilise g++ monfichier.cpp -o monfichier

                                  Mac Os 10.13.6

                                  POURQUOI CA NE MARCHE PAS CHEZ MOI

                                  mon fichier test2.rft:

                                  hello





                                  -
                                  Edité par AntoineBarbier12 il y a moins de 5s





                                  -
                                  Edité par TheSmiley 13 juin 2021 à 15:31:46

                                  • Partager sur Facebook
                                  • Partager sur Twitter
                                    13 juin 2021 à 15:40:09

                                    g++ main.cpp -std=c++17 -o monfichier

                                    comme cela ça ne compile toujours pas ? L'erreur est toujours la même ou elle a changé ?


                                    • Partager sur Facebook
                                    • Partager sur Twitter
                                      13 juin 2021 à 15:47:38

                                      Umbre37 a écrit:

                                      g++ main.cpp -std=c++17 -o monfichier

                                      comme cela ça ne compile toujours pas ? L'erreur est toujours la même ou elle a changé ?



                                      non, rien n'a changé , :'(:'(:'(:'(  

                                      je vois arriver quelque chose de plus grave et beaucoup plus bizarre:

                                      quand je mets ceci :

                                      #include <iostream>
                                      #include <fstream>
                                      
                                      int main(int argc, char const *argv[])
                                      {
                                      	std::ifstream f("test3.txt");
                                      	char c;
                                      	f >> c;
                                              std::cout << c << std::endl;
                                      	return 0;
                                      }

                                      ca affiche  {

                                      mais quand je mets ceci:

                                      #include <iostream>
                                      #include <fstream>
                                      
                                      int main(int argc, char const *argv[])
                                      {
                                      	std::ifstream f("test3.txt");
                                      	char c;
                                      	f >> c;
                                      	f >> c;
                                      	std::cout << c << std::endl;
                                      	return 0;
                                      }

                                      ca affiche /

                                       mon fichier test3.txt:

                                      hello 





                                      -
                                      Edité par TheSmiley 13 juin 2021 à 16:00:29

                                      • Partager sur Facebook
                                      • Partager sur Twitter
                                        13 juin 2021 à 16:00:01

                                        Tu as bien recompilé tout tes fichiers ? Si oui, je ne comprends pas. Moi j'ai mis tout tes codes dans le main et ça marche.
                                        Essaye :

                                        #include <iostream>
                                        #include <string>
                                        #include <fstream>
                                         
                                        std::ofstream init_of(std::string file);
                                        std::ifstream init_if(std::string file);
                                         
                                        class OPEN {
                                        public:
                                            OPEN(std::string file_c);
                                            std::string read(int nb);
                                            std::string read();
                                            std::string readline();
                                            std::string nbWords();
                                            void write();
                                        private:
                                            std::string n_file;
                                            std::ofstream file_w;
                                            std::ifstream file_r;
                                         
                                         
                                        };
                                         
                                        OPEN::OPEN(std::string file_c) : n_file(file_c){
                                            file_r.open(file_c.c_str());
                                            file_w.open(file_c.c_str());
                                            }
                                         
                                        std::string OPEN::read() {
                                            std::string body;
                                            std::string line;
                                         
                                         
                                            while(getline(file_r, line)) {
                                                body += line;
                                            }
                                         
                                            return body;
                                        }
                                         
                                        std::string OPEN::readline() {
                                         
                                            static std::string line = " ";
                                            if(getline(file_r, line)){}
                                            else {
                                                line = "";
                                                std::cout << "INFO: vous ne pouvez plus lire: vous êtes à la fin du fichier\n" <<std::endl;
                                            }
                                            return line;
                                        }
                                         
                                        std::ofstream init_of(std::string file) {
                                            std::ofstream n(file.c_str());
                                            return n;
                                        }
                                         
                                        std::ifstream init_if(std::string file) {
                                            std::ifstream n(file.c_str());
                                            return n;
                                        }
                                         
                                        int main()
                                        {
                                            OPEN n("test2.rft");
                                            std::cout<<n.read() << std::endl;
                                            return 0;
                                        }

                                        Si là ton code ne compile toujours pas je ne peux plus rien pour toi (il faudra mettre ton compilateur à jour je pense)... Et voir avec des personnes plus compétentes que moi.


                                        • Partager sur Facebook
                                        • Partager sur Twitter
                                          13 juin 2021 à 16:10:04

                                          ca marche à moitié : il y a 0 erreur mais ca n'affiche rien:waw:

                                          Bonne et Mauvaise nouvelle : 

                                          la bonne : c'est que presque rien ne bug car le fichier est vide donc c'est normal de ce point de vue là(que ça n'affiche rien)

                                          la mauvaise : c'est que normalement il devrait avoir hello(j'ai essayé plusieurs fois de réecrire le fichier mais rien)

                                          PS : j'ai essayé sur python même erreur POURQUOI? en fin(FileNoFound)

                                          -
                                          Edité par TheSmiley 13 juin 2021 à 16:20:16

                                          • Partager sur Facebook
                                          • Partager sur Twitter
                                            13 juin 2021 à 16:16:07

                                            AntoineBarbier12 a écrit:

                                            ca marche à moitié : il y a 0 erreur mais ca n'affiche rien:waw:


                                            oui, mais ça c'est normal, l'ouverture du flux d'écriture sur ton fichier l'efface...

                                            1) refais ton fichier avec hello

                                            2) supprime la ligne 

                                            file_w.open(file_c.c_str());

                                            3)recompile

                                            4)exécute

                                            -
                                            Edité par Umbre37 13 juin 2021 à 16:24:28

                                            • Partager sur Facebook
                                            • Partager sur Twitter
                                              13 juin 2021 à 16:22:18

                                              pourquoi et comment ne pas l'effacer
                                              • Partager sur Facebook
                                              • Partager sur Twitter
                                                13 juin 2021 à 16:26:28

                                                Umbre37 a écrit:

                                                 /!\  file_w(file_c) effacera ton fichier (après, moi, je ne sais pas ce que tu veux faire)...

                                                -
                                                Edité par Umbre37 il y a environ 6 heures



                                                -
                                                Edité par Umbre37 13 juin 2021 à 16:27:07

                                                • Partager sur Facebook
                                                • Partager sur Twitter
                                                  13 juin 2021 à 16:28:18

                                                  AntoineBarbier12 a écrit:

                                                  pourquoi et comment ne pas l'effacer

                                                  Ouvre-le en lecture !

                                                  Cordialement

                                                  • Partager sur Facebook
                                                  • Partager sur Twitter
                                                    13 juin 2021 à 16:31:32

                                                    méme sans ca ca ne marche pas
                                                    • Partager sur Facebook
                                                    • Partager sur Twitter
                                                      13 juin 2021 à 16:44:17

                                                      Dedeun a écrit:

                                                      AntoineBarbier12 a écrit:

                                                      pourquoi et comment ne pas l'effacer

                                                      Ouvre-le en lecture !

                                                      Cordialement


                                                      Il ouvre deux flux, un en lecture et un en écriture au moment où il construit sa classe OPEN, alors forcément...
                                                       

                                                      @AntoineBarbier12

                                                      Je pense que tu as un problème de conception. À mon avis, il faut bien séparer écriture et lecture dans ton code. En général, il faut prévoir une classe (ou une fonction) par tâche et pas moins ! Faire une classe comme ton OPEN qui fait à manger, à boire, la vaisselle et le café amène très vite des problèmes...

                                                      Si tu veux progresser un peu et faire quelque chose d'utilisable : 

                                                      1) Initialise toutes tes variables membres dans la liste d'initialisation du constructeur.

                                                      2) Ne copie pas de string ! passe-les en paramètre par référence et non en retour de fonction.

                                                      3) déclare constant tout ce qui doit l'être.

                                                      4) compile avec -Wall -Werror -Wextra

                                                      5) jamais de using namespace std;

                                                      AntoineBarbier12 a écrit:

                                                      méme sans ca ca ne marche pas


                                                      Si ça marche.

                                                      Soit tu as effacé ton fichier test.txt et tu as oublié de le réécrire, soit tu n'as pas la bonne version de ton code. Je pense que tu te trompes dans les version de tes fichiers...

                                                      -
                                                      Edité par Umbre37 13 juin 2021 à 17:10:19

                                                      • Partager sur Facebook
                                                      • Partager sur Twitter
                                                        13 juin 2021 à 16:58:56

                                                        Les flux C++ (qui est une "API" toute pourrie à mes yeux), est une abstraction des FILE* du C qui utilise les préceptes d'UNIX, l'OS qui a servi de cadre de conception du langage C.

                                                        Dans ce système, tout, que cela soit les entrée console, les sorties console, les fichiers sont conçu comme un flux d'octet. Donc, avoir un pointeur en lecture et un pointeur en écriture différent, même pas en rêve.

                                                        Et comme on n'est pas trop con, et que ça simplifie la vie, on suit les conseils des autres et on évite d'ouvrir le même fichier à la fois en lecture et en écriture, à moins de vouloir tester comment sont (mal) implémentés les couches C des librairies ou de l'OS.

                                                        • Partager sur Facebook
                                                        • Partager sur Twitter
                                                        Je recherche un CDI/CDD/mission freelance comme Architecte Logiciel/ Expert Technique sur technologies Microsoft.

                                                        libc++abi.dylib

                                                        × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
                                                        × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
                                                        • Editeur
                                                        • Markdown