Après avoir lu Jerry Coffin la réponse à ce question J'ai copié-collé son code dans mon éditeur, et après quelques modifications mineures, il a compilé et exécuté comme il se doit.Lecture du fichier jusqu'à la ligne vide
Voici le code après les modifications:
#include <iostream>
#include <string>
#include <istream>
#include <fstream>
class non_blank {
private:
std::string data_;
friend std::istream& operator>> (std::istream &is, non_blank &n) {
std::getline(is, n.data_);
if (n.data_.length() == 0) {
is.setstate(std::ios::failbit);
}
return is;
}
public:
operator std::string() const {
return data_;
}
};
int main(int, char *[]) {
non_blank line;
std::ifstream ifs("teste.txt");
while(ifs >> line) {
//std::cout << line; <----- error
std::string s = line;
std::cout << s << std::endl;
}
return 0;
}
J'ai une erreur en essayant d'utiliser une variable non_blank dans une expression
std::cout <<...
. Ne devrais-je pas être capable d'utiliser une variable du type non_blank partout où j'utiliserais std :: string? N'est-ce pas le but de l'opérateur cast/conversion ?? answerPourquoi ne puis-je accéder à la variable privée
string::data_
directement dans la définition de laoperator >>
?
Voici l'erreur que je suis:
..\main.cpp: In function `std::istream& operator>>(std::istream&, non_blank&)':
..\main.cpp:21: error: invalid use of non-static data member `non_blank::data_'
..\main.cpp:26: error: from this location
Je n'ai pas compris quelque chose dans votre question ni dans le code (parce que je ne connais pas très bien C++), mais, sur la base du titre (lire le fichier jusqu'à la ligne vide) voici mon idée: pourquoi ne pas lire? chaque personnage et le comparer à celui qui le précède? si elles sont toutes deux '\ n', vous avez rencontré une ligne vide. – BlackBear
Le code est entièrement fonctionnel: lit un fichier, ligne par ligne, jusqu'à ce qu'il rencontre une ligne vide. Pour pouvoir compiler, je devais faire de petits changements. C'est pourquoi j'ai posé ces questions. – bruno
oh .. désolé alors .. – BlackBear