[c++] lire un fichier

Le problème exposé dans ce sujet a été résolu.

Bonjour à tous,

Actuellement en reconversion en bioinformatique, je débute en C++. Je dois rendre un projet en C++ (C++98).

Mon programme doit lire un fichier fasta. Il est constitué de 3 fichiers :

  • main.cpp
  • ProcessFastaFile.cpp
  • ProcessFastaFile.h

Je le compile avec un makefile, qui me retourne l’erreur suivante :

g++ -Wall -ansi -pedantic -c ProcessFastaFile.cpp
g++ -Wall -ansi -pedantic -c main.cpp
main.cpp:19:32: error: no viable conversion from 'std::__1::string' (aka 'basic_string<char,
      char_traits<char>, allocator<char> >') to 'char'
  fileFasta.readHeaderSequence(fasta);
                               ^~~~~
/Library/Developer/CommandLineTools/usr/bin/../include/c++/v1/string:876:5: note: candidate
      function
    operator __self_view() const _NOEXCEPT { return __self_view(data(), size()); }
    ^
./ProcessFastaFile.h:11:38: note: passing argument to parameter 'fasta' here
        void readHeaderSequence(char fasta);
                                     ^
1 error generated.
make: *** [main.o] Error 1

Où est mon erreur ?

Voici les différents codes.

  • main.cpp
#include <iostream>
#include "ProcessFastaFile.h"
#include <string>

using namespace std;

int main(int argc, char* argv[]) {

  string fasta;

  // Scans the command line                                                                                                                                                      
  for (int i = 1; i < argc; i++) {
    if ((strcmp(argv[i], "-fasta") == 0) && (i < argc-1)) // Compare the first argument with "fasta", if it returns true, it will be compared with (i < arc-1)                   
    fasta = string(argv[++i]);
  }

  ProcessFastaFile fileFasta; // Create an object fastaFile (Statique)                                                                                                           

  fileFasta.readHeaderSequence(fasta);

  return 0;
}
  • ProcessFastaFile.cpp
#include <iostream>
#include <fstream>
#include <string>
#include "ProcessFastaFile.h"

using namespace std;

void ProcessFastaFile::readHeaderSequence(char fasta){

    //std::cout << "Rien ne marche !" << endl;                                                                                                                                   

    ifstream fastaFile;

    string line;

    if(fastaFile) {
        while(getline(fastaFile, line)) {
            std::cout << line << endl;
        }
    }
    else {
        std::cout << "ERROR: can't open the file." << endl;
    }
}
  • ProcessFastaFile.h
#include <string>

class ProcessFastaFile {

    public:

        // Constructeur                                                                                                                                                          
        ProcessFastaFile();

        // Methode                                                                                                                                                               
        void readHeaderSequence(char fasta);                                                                                                                                                                      
};
  • Makefile
GCC_OPTS = -Wall -ansi -pedantic
CXX = g++
                                
fausse_cible: mon_prog

ProcessFastaFile.o: ProcessFastaFile.cpp ProcessFastaFile.h
        $(CXX) $(GCC_OPTS) -c ProcessFastaFile.cpp

main.o: main.cpp
        $(CXX) $(GCC_OPTS) -c main.cpp

mon_prog: ProcessFastaFile.o main.o
        $(CXX) ProcessFastaFile.o main.o -o mon_prog

Merci beaucoup pour votre aide.

+0 -0

Ca marche, merci pour ton aide @informaticienzero. Par contre, lors de la compilation avec mon makefile, j’ai ce message d’erreur (voir ci-dessous). J’ai du mal à le comprendre. Que signifie t-il ?

g++ -Wall -ansi -pedantic -c ProcessFastaFile.cpp
g++ -Wall -ansi -pedantic -c main.cpp
g++ ProcessFastaFile.o main.o -o mon_prog
Undefined symbols for architecture x86_64:
  "ProcessFastaFile::ProcessFastaFile()", referenced from:
      _main in main.o
ld: symbol(s) not found for architecture x86_64
clang: error: linker command failed with exit code 1 (use -v to see invocation)
make: *** [mon_prog] Error 1

Merci @lmghs pour ton aide.

J’ai retiré la déclaration en faisant : //ProcessFastaFile();. Lorsque je fais make, je n’ai aucun message d’erreur. Problème, lorsque j’exécute mon programme (./mon_prog -fasta calmodulin.fasta), il me renvoie rien du tout. Il ne lit pas le fichier fasta ou ne me renvoie pas de message d’erreur.

Où ai-je fais une erreur ? Il y a un truc qui m’échappe.

Tu n’ouvres jamais le fichier, par conséquent rien ne se passe. Il te manque aussi l’option -Wextra qui te l’aurais indiqué.

Si tu veux un code compatible C++98 (drôle d’idée), il te faut aussi le préciser avec -std=c++98. Cela fait bien longtemps que les compilateurs sont en C++03, C++11 ou C++14 par défaut.

+1 -0

Merci @jo_link_noir pour ton aide.

Tu n’ouvres jamais le fichier, par conséquent rien ne se passe. Il te manque aussi l’option -Wextra qui te l’aurais indiqué.

Le fichier ne s’ouvre pas avec ifstream ? L’option -Wextra me retourne ceci :

ProcessFastaFile.cpp:8:55: warning: unused parameter 'fasta' [-Wunused-parameter]
void ProcessFastaFile::readHeaderSequence(std::string fasta){
                                                      ^
1 warning generated.

Je comprends que mon paramètre n’est pas utilisé.

Si tu veux un code compatible C++98 (drôle d’idée), il te faut aussi le préciser avec -std=c++98. Cela fait bien longtemps que les compilateurs sont en C++03, C++11 ou C++14 par défaut.

jo_link_noir

Mon mac date de 2018. J’ai cherché la version du compilateur (g++) et j’ai trouvé C++98.

Mon mac date de 2018. J’ai cherché la version du compilateur (g++) et j’ai trouvé C++98.

wanaga

Je ne comprends pas comment tu as pu obtenir C++98 en cherchant la version de ton compilateur. Cette info n’est indiquée nulle part. Et en 2018, g++ et clang++ étaient en C++14 par défaut.

Ton code n’est pas compatible C++98.

Mon mac date de 2018. J’ai cherché la version du compilateur (g++) et j’ai trouvé C++98.

wanaga

Je ne comprends pas comment tu as pu obtenir C++98 en cherchant la version de ton compilateur. Cette info n’est indiquée nulle part. Et en 2018, g++ et clang++ étaient en C++14 par défaut.

Ton code n’est pas compatible C++98.

jo_link_noir

J’ai exécuté ce script, trouvé sur un forum, pour connaitre la version du compilateur.

#include<iostream>

int main() {
   if (__cplusplus == 201703L)
     std::cout << "C++17" << std::endl;
   else if (__cplusplus == 201402L)
     std::cout << "C++14" << std::endl;
   else if (__cplusplus == 201103L)
     std::cout << "C++11" << std::endl;
   else if (__cplusplus == 199711L)
     std::cout << "C++98" << std::endl;
   else
     std::cout << "pre-standard C++" << std::endl;
}
+0 -0

La version du compilateur se trouve avec g++ --version. Ce que tu fais là est de regarder la version du standard. Sauf qu’ouvrir un fichier avec std::string n’est possible que depuis C++11, ton code n’est donc pas compatible C++98.

Après, comme tu es sous Mac, le compilateur est en réalité clang++ (ce que —version confirmera) et la lib standard fournit avec ne respecte pas la norme C++98 sur ce point.

J’ai aussi l’impression que tu utilises une vieille version car cela fait un moment qu’il est en C++14 par défaut. À savoir que la version actuelle est la 11 (la 12 sort bientôt).

Connectez-vous pour pouvoir poster un message.
Connexion

Pas encore membre ?

Créez un compte en une minute pour profiter pleinement de toutes les fonctionnalités de Zeste de Savoir. Ici, tout est gratuit et sans publicité.
Créer un compte