ofstream modes ouverts: mangé vs app

Cette question demande la différence entre app et ate et les deux réponses cppreference impliquent que la seule différence est que app signifie que le curseur d’écriture est placé à la fin du fichier avant chaque opération d’écriture, alors que ate signifie que le curseur d’écriture est placé à la fin du fichier uniquement lors de l’ouverture.

Ce que je constate réellement (dans VS 2012), c’est que spécifier ate supprime le contenu d’un fichier existant , contrairement à app (il ajoute un nouveau contenu au contenu existant précédemment). En d’autres termes, ate semble impliquer trunc .

L’instruction suivante ajoute “Hello” à un fichier existant:

 ofstream("trace.log", ios_base::out|ios_base::app) << "Hello\n"; 

Mais l’instruction suivante remplace le contenu du fichier par “Hello”:

 ofstream("trace.log", ios_base::out|ios_base::ate) << "Hello\n"; 

La documentation MSDN pour VS 6.0 implique que cela ne devrait pas arriver (mais cette phrase semble avoir été retirée dans les versions ultérieures de Visual Studio):

ios :: trunc : Si le fichier existe déjà, son contenu est ignoré. Ce mode est impliqué si ios :: out est spécifié et que ios :: ate, ios :: app et ios: in ne sont pas spécifiés.

Vous devez combiner std::ios::in avec std::ios::ate puis rechercher la fin du fichier et append le texte suivant:

Considérons que j’ai un fichier “data.txt” qui contient cette ligne:

 "Hello there how are you today? Ok fine thanx. you?" 

Maintenant je l’ouvre:

1: std :: ios :: app:

 std::ofstream out("data.txt", std::ios::app); out.seekp(10); // I want to move the write pointer to position 10 out << "This line will be appended to the end of the file"; out.close(); 

Le résultat n'est pas ce que je voulais: ne pas déplacer le pointeur d'écriture, mais seul le texte est toujours ajouté à la fin.

2: std :: ios :: ate:

 std::ofstream out2("data.txt", std::ios::ate); out2 << "This line will be ate to the end of the file"; out2.close(); 

Le résultat ci-dessus n'est pas ce que je voulais, aucun texte n'a été ajouté mais le contenu est tronqué!

Pour le résoudre, combinez a ate in :

 std::ofstream out2("data.txt", std::ios::ate | std::ios::in); out2 << "This line will be ate to the end of the file"; out2.close(); 

Maintenant le texte est ajouté à la fin mais quelle est la différence:

Comme je l'ai dit, l'application ne permet pas de déplacer le pointeur d'écriture mais mange le fait.

 std::ofstream out2("data.txt", std::ios::ate | std::ios::in); out2.seekp(5, std::ios::end); // add the content after the end with 5 positions. out2 << "This line will be ate to the end of the file"; out2.close(); 

Ci-dessus, nous pouvons déplacer le pointeur d'écriture sur la position que nous voulons, alors qu'avec l'application, nous ne le pouvons pas.