Partage
  • Partager sur Facebook
  • Partager sur Twitter

lecture tableaux complexes

    13 juin 2008 à 14:37:57

    Bonjour,

    Alors voilà : j’essaie de lire un tableau de type vector<vector<complex<double> > > (un simple tableau/matrice de nombres complexes en fait).

    Les données à lire sont donc sous la forme :

    (x,y) (x,y) (x,y) …
    (x,y) (x,y) (x,y) …
    (x,y) (x,y) (x,y) …
    .
    .
    .

    Chaque doublet (x,y) est séparé du suivant par un caractère d’espacement « \t ». Chaque ligne est séparée de la suivante par un « \n ».
    J’utilise la fonction C fscanf, et elle marche bien pour la fonction qui lit juste un vecteur de complexes. Par contre elle plante lorsqu’il s’agit de lire un tableau.

    J’essaie de détecter le caractère de fin de ligne « \n », mais apparemment c’est là que çà coince. « \n » n’est jamais détecter ! J’ai essayé de mieux comprendre comment marche cette fonction (fscanf) avec un tutoriel, mais rien n’y fait.

    Enfin, cette fonction est du C (si je ne m’abuse) alors que moi je code en C++ de préférence. Quelle serait la fonction équivalente à fscanf en C++ ? fread ? Et comment pourrais-je l’utiliser en pratique pour lire des vecteurs complexes et des tableaux complexes

    J’en ai vraiment besoin, et j’ai déjà perdu beaucoup de temps en essayant plein de possibilité avec cette fonction. Please help !


    // Method to read a complex array
    vector<vector<complex<double> > > Readvector2::Readcomplexarray(string Filename)
    {
    FILE* m_File_in = fopen((Filename + ".txt").c_str(),"r");
    typedef complex<double> dcomplex;

    vector<dcomplex> Data_vector;
    vector<vector<complex<double> > > Data_array;

    unsigned short int n = 0; // n lines
    double junk1, junk2;

    if(m_File_in)
    {
    dcomplex c = (0.,0.);
    Data_vector.clear();
    Data_array.clear();
    rewind(m_File_in);
    unsigned short int n = 0, m = 0;

    while(!feof(m_File_in))
    {
    m = 0;
    Data_vector.clear();
    while(m == 0) // \n occured
    {
    n = n + fscanf(m_File_in,"(%lf,%lf)\t",&c.real(),&c.imag());
    Data_vector.push_back(c);
    m = m + fscanf(m_File_in,"%lf)\t\n(%lf",&junk1,&junk2);
    // cout<<"ligne n°: \n"<<m<<"\n";
    }
    Data_array.push_back(Data_vector);
    }
    fclose(m_File_in);

    if(m == 0 || m == EOF) // Check m fscanf
    {
    cout<<"No matching pattern found in "<<(Filename + ".txt").c_str()<<"\n";
    }
    }
    else
    if(!m_File_in)
    cerr<<"Error while trying to open "<<(Filename + ".txt").c_str()<<"\n";
    return(Data_array);
    }
    • Partager sur Facebook
    • Partager sur Twitter
      13 juin 2008 à 14:40:26

      utilise les balises de Code STP
      • Partager sur Facebook
      • Partager sur Twitter
        13 juin 2008 à 14:48:32

        Essaye plutôt les flux standards fstream. C'est mieux en C++.

        Il y a un tutoriel sur ce site.
        • Partager sur Facebook
        • Partager sur Twitter
        Co-auteur du cours de C++. ||| Posez vos questions sur le forum ||| Me contacter.
          13 juin 2008 à 14:51:32

          Ok, désolé je suis tout nouveau sur le site, je ne sais pas où sont lesdites balises.

          A Nanoc: j'aimerais beaucoup utiliser la bibliothèque fstream, mais justement je ne trouve pas la fonction équivalente à fscanf (c'est le 2e objet de mon msg) en C++. J'ai déjà lu le tutoriel qui est d'ailleurs très bien fait, et m'a aider mais il ne va pas assez loin pour me dire comment faire ce que je voudrais...
          • Partager sur Facebook
          • Partager sur Twitter
            13 juin 2008 à 15:29:01

            L'idée en C++ est plutôt la suivante:

            1) Récupérer les lignes du fichier via getline() et les mettres dans une string
            2) Traiter ensuite la string en la découpant comme tu l'entends.

            • Partager sur Facebook
            • Partager sur Twitter
            Co-auteur du cours de C++. ||| Posez vos questions sur le forum ||| Me contacter.
              13 juin 2008 à 16:09:24

              Ok pour l'idée Nanoc, mais çà ne risque pas de faire un peu lourd comme code de passer d'abord par des strings? il n'y a donc pas d'équivalent de fscanf en C++? Et sinon, quelqu'un sait-il comment utiliser fscanf pour détecter un "\n" (endl)

              D'avance, merci

              // Method to read a complex array
              vector<vector<complex<double> > > Readvector2::Readcomplexarray(string Filename)
              {	
              	FILE* m_File_in = fopen((Filename + ".txt").c_str(),"r");
              	typedef complex<double> dcomplex;
              
              	vector<dcomplex> Data_vector;
              	vector<vector<complex<double> > > Data_array; 
              
              	unsigned short int n = 0; // n lines
              	double junk1, junk2;
              
              	if(m_File_in)
              	{	
              		dcomplex c = (0.,0.);
              		Data_vector.clear();
              		Data_array.clear();
              		rewind(m_File_in);
              		unsigned short int n = 0, m = 0;
              
              		while(!feof(m_File_in))
              		{	
              			m = 0;
              			Data_vector.clear();
              			while(m == 0) // \n occured
              			{
              				n = n + fscanf(m_File_in,"(%lf,%lf)\t",&c.real(),&c.imag());
              				Data_vector.push_back(c);
              				m = m + fscanf(m_File_in,"%lf)\t\n(%lf",&junk1,&junk2);
              				// cout<<"ligne n°: \n"<<m<<"\n";
              			}
              			Data_array.push_back(Data_vector);
              		}
              		fclose(m_File_in);
              
              		if(m == 0 || m == EOF) // Check m fscanf 
              		{
              			cout<<"No matching pattern found in "<<(Filename + ".txt").c_str()<<"\n";
              		}
              	}
              	else
              		if(!m_File_in)
              			cerr<<"Error while trying to open "<<(Filename + ".txt").c_str()<<"\n";
              	return(Data_array);
              }
              


              • Partager sur Facebook
              • Partager sur Twitter
                13 juin 2008 à 16:48:15

                Je pense sincèrement que le tout prendra une vingtaine de lignes au grand maximum.

                Pour le fscanf, désolé j'y connais rien au C.
                • Partager sur Facebook
                • Partager sur Twitter
                Co-auteur du cours de C++. ||| Posez vos questions sur le forum ||| Me contacter.
                Anonyme
                  13 juin 2008 à 16:58:43

                  fscanf doit faire qqch comme les << de fstream. Ça lit une chaines formatée.

                  Mais avec getline, tu peux le faire facilement :
                  > récupère la ligne dans une std::string.
                  > découpe la aux espaces/parenthèses/....
                  > ...
                  • Partager sur Facebook
                  • Partager sur Twitter

                  lecture tableaux complexes

                  × 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