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.