Lire contenu de plusieurs fichiers en même temps [Résolu/Fermé]

Signaler
Messages postés
3
Date d'inscription
jeudi 26 novembre 2015
Statut
Membre
Dernière intervention
7 janvier 2016
-
Messages postés
29276
Date d'inscription
jeudi 12 mai 2005
Statut
Modérateur
Dernière intervention
3 septembre 2020
-
je suis en train d' essayer d' ecrire un Programme qui demande à l' utilisateur de donner le nombre des fichiers à ouvrir (1 à 4), les noms des fichiers (6 caratères)ensuite le Programme les ouvre et lit le contenu de chaque fichier et affiche tous les contenus en même temps.

voici ma première fonction qui marche très bien.

 

void entrer_nom(const int& m, int& nb_1, char in_name[4][7])
{
m = 4;
cout << "Nb =";
cin >> nb_1;

if (nb_1 <= m)
{
for (int j = 1; j <= nb_1; j++)
{
cout << j << ".Cmd_Name =";
cin >> &in_name[j][7];

}

}

}


et là la fonction à problème

   
void lire_contenu(ifstream&, char file_Name[4][7], char name_1[7], int& n_1, double& sd_1)
{

ifstream inf;

//cout << "Enter the file name to be opened: ";
//cin >> file_Name;

inf.open(file_Name, ios::in);

if (inf.fail())
{
exit(1);
}


else
{

cout << "Cmd_Name:" << file_Name << endl;

inf >> name_1 >> set_id1;

inf.ignore(numeric_limits<streamsize>::max(), '\n');

inf >> n_1 >> sd_1;


}

inf.close();

cout << "NAME:" << name_1 << endl;
cout << "SET_ID:" << set_id1 << endl;
cout << "N =" << n_1 << endl;
cout << "SubD =" << sd_1 << endl;


return;
}




merci d' avance pour tous vos aides

1 réponse

Messages postés
29276
Date d'inscription
jeudi 12 mai 2005
Statut
Modérateur
Dernière intervention
3 septembre 2020
6 912
Ça me paraît un peu compliqué. Je ferais d'abord une boucle qui demande les noms de fichiers, puis ensuite qui les affiche. Je n'ai pas compris ce qu'était set_id.

Par ailleurs je ne sais pas trop ce que tu entends par afficher le contenu en même temps (car j'imagine que tu vas en pratique les afficher les uns après les autres) ?

#include <fstream>
#include <iostream>
#include <list>
#include <ostream>
#include <string>

std::string prompt_filename(std::size_t i, std::size_t n) {
    std::string filename;
    do {
        std::cout << "Filename (" << i << '/' << n
            << ") (6 chars max)? ";
        std::cin >> filename;
    } while (filename.size() > 6 || filename.size() == 0);
    return filename;
}         
          
bool print_file(std::ostream & os, const std::string & filename) {
    bool ret = false;
    std::ifstream ifs(filename);
    if (ifs) {
        std::string line;
        while (std::getline(ifs, line)) {
            os << line << std::endl;
        }
        ifs.close();
        ret = true;
    }   
    return ret;
}                    
                     
int main() {
    std::size_t num_files;
    std::list<std::string> filenames;

    do {
        std::cout << "Number of files [1-4]?";
        std::cin >> num_files;
    } while(num_files == 0 || num_files > 4); 

    for (std::size_t i = 0; i < num_files; ++i) {
        filenames.push_back(prompt_filename(i, num_files));
    }                      
                           
    for (const std::string & filename : filenames) {
        bool success = print_file(std::cout, filename);
        if (!success) {
            std::cerr << "Can't print [" << filename
                << ']' << std::endl;
        }   
    }   
    
    return 0;
}


Compilation :

g++ -std=c++11 -W -Wall toto.cpp -o toto


Exécution :

./toto



Bonne chance
Messages postés
3
Date d'inscription
jeudi 26 novembre 2015
Statut
Membre
Dernière intervention
7 janvier 2016

je n' ai pas été précis dans la formulation de ma question, je m' en excuse. En fait set_id1 est un string à 17 charatères ( char set_id[17]) que j' ai oublier de declarer dans ma fonction lire_contenu(). En plus en ecrivant "lit le contenu de chaque fichier" je pensais à la lecture des varaiables bien précises dans le contenu du fichier ( inf >> name_1 >> set_id1) et un int et un double ( inf >> n_1 >> sd_1). Je viens de tester ton programme, il marche très bien sauf que tu as omis (size_t i) sur la ligne 7 et les parenthèses (filename.size() == 0) sur la ligne 13. merci pour ton aide
Messages postés
29276
Date d'inscription
jeudi 12 mai 2005
Statut
Modérateur
Dernière intervention
3 septembre 2020
6 912
Oui merci pour tes corrections (répercutées dans mon premier message).

En fait j'ai ajouté ça après coup pour coller à ton énoncé mais comme tu l'as compris le programme marcherait sans ces tests pour des strings de longueurs à priori quelconques et je n'ai pas testé derrière.

Pour être homogène avec prompt_filename, on aurait également pu créer prompt_num_files.

Bonne continuation !