2013-07-31 2 views
3

J'essaie actuellement de copier un vecteur dans un nouveau fichier texte après avoir apporté les modifications nécessaires au vecteur. Je peux bien construire le projet, mais ça me donne des erreurs bizarres que je ne comprends pas. Quelqu'un pourrait-il m'aider avec ça?Copier le vecteur struct dans le fichier en utilisant ostream_iterator et copier

Mon struct

class AccDetails { 
public: 
    string username; 
    string name; 
    string topicid; 
    string testid; 
}; 

Le code qui me donne les erreurs

vector<AccDetails>accInfo; 
ofstream temp ("temp.txt"); 
ostream_iterator<AccDetails>temp_itr(temp,"\n"); 
copy(accInfo.begin(),accInfo.end(),temp_itr); 

Il y a toute une partie des lignes d'erreur, mais je pense que cela devrait être les 2 lignes importantes: enter image description here

Répondre

3

Vous devrez surcharger operator<< pour AccDetails. C'est ce que ostream_iterator appelle à l'interne.

comme ceci:

std::ostream& operator<<(std::ostream& stream, const AccDetails& obj) 
{ 
    // insert objects fields in the stream one by one along with some 
    // description and formatting: 

    stream << "User Name: " << obj.username << '\n' 
      << "Real Name: " << obj.name << '\n' 
      << obj.topicid << ' ' << obj.testid << '\n'; 

    return stream; 
} 

L'opérateur prend le courant insère comme premier paramètre et une référence constante à l'objet qu'il est en streaming que la seconde (ce qui permet le passage AccDetails temporaire, aussi). Maintenant, vous pouvez aussi dire:

AccDetails acc; 
std::cout << acc; 

Si l'opérateur aurait besoin d'un accès aux champs privés de AccDetail, vous devez déclarer comme friend.

Si vous êtes nouveau à la surcharge de l'opérateur, je vous suggère de lire this SO thread.

Espérons que ça aide.

+0

@JoelSeah J'édité la réponse. – jrok

+0

Merci. Je comprends maintenant ^^ –

+0

@jrok compilera-t-il? – P0W

2

peut avoir cette après surcharge comme JROK dit:

class AccDetails 
{ 

    std::string username; 
    std::string name; 
    std::string topicid; 
    std::string testid; 

    friend std::ostream& operator<<(std::ostream&, const AccDetails&); 
    friend std::istream& operator>>(std::istream& is, AccDetails&); 
}; 

std::ostream& operator<<(std::ostream& os, const AccDetails& acc) 
{ 
    os << "User Name: " << acc.username << std::endl 
      << "Name: " << acc.name << std::endl 
      << acc.topicid << ' ' << acc.testid << std::endl; 
    return os; 
} 

std::istream& operator>>(std::istream& is, AccDetails& acc) 
{ 
    is >> acc.username >>acc.name >> acc.topicid >> acc.testid ; 
    return is; 
} 


int main() 
{ 

std::vector<AccDetails>accInfo; 

std::copy(std::istream_iterator<AccDetails>(std::cin), 
    std::istream_iterator<AccDetails>(),std::back_inserter(accInfo)); 

std::ofstream temp("temp.txt",std::ios::out); 
std::ostream_iterator<AccDetails>temp_itr(temp,"\n"); 
std::copy(accInfo.begin(),accInfo.end(),temp_itr); 

} 
+0

Notez que dans le code OP, les champs 'AccDetails' sont publics, il n'est donc pas nécessaire que les opérateurs de flux soient amis. – juanchopanza

+0

@juanchopanza ouh oui, merci, de toute façon la réponse de jrok ci-dessus est déjà acceptée :) – P0W