Vidéo: Loneliness 2024
Lorsque vous ouvrez un fichier en construisant une instance ofstream ou ifstream, vous pouvez modifier la façon dont le fichier s'ouvrira en fournissant ce qu'on appelle des flags. En termes informatiques, un indicateur est simplement un petit élément dont la présence ou le manque de présence indique à une fonction comment faire quelque chose. Avec les classes ofstream et ifstream, la fonction en question est le constructeur.
Un indicateur ressemble à l'application ios:: si vous utilisez un compilateur qui n'est pas entièrement compatible ANSI ou qui ressemble à l'app ios_base:: si vous en utilisez un qui est entièrement compatible ANSI. Cet indicateur particulier signifie que vous voulez écrire dans un fichier, mais vous souhaitez ajouter à toutes les données existantes qui peuvent déjà être dans un fichier. Vous fournissez ce drapeau en tant qu'argument du constructeur pour ofstream, comme dans l'un des exemples suivants:
outstream du fichier ("AppendableFile.txt", ios:: app); outstream du fichier ("AppendableFile. txt", ios_base:: app);
Vous pouvez voir que l'indicateur est ajouté en tant que deuxième paramètre au constructeur. D'autres indicateurs existent en plus de l'application, et vous pouvez les combiner en utilisant l'opérateur ou, | Par exemple, un drapeau est ios:: nocreate (qui n'est pas inclus dans les nouveaux compilateurs).
Celui-ci signifie "ouvrir seulement le fichier s'il existe déjà. "C'est-à-dire, ne créez pas le fichier s'il n'existe pas. (Souvenez-vous, ofstream crée un fichier s'il n'existe pas déjà.) Si le fichier n'existe pas, l'ouverture échouera et, lorsque vous appellerez échouer, vous obtiendrez un vrai .
Le drapeau ios:: nocreate est pratique avec ios:: app. Ensemble, ils signifient ouvrir un fichier existant et y ajouter . Autrement dit, les deux ensemble ne fonctionneront que si le fichier existe déjà et l'appel ouvrira le fichier pour une opération d'ajout. Si le fichier n'existe pas déjà, le fichier ne sera pas créé. Voici un exemple d'appel:
ofstream outfile ("… / MyFile.txt", ios:: app | ios:: nocreate); if (outfile. fail ()) {cout << "n'a pas pu ouvrir le fichier!" << endl; return 0;} outfile << "salut" << endl; fichier sortant. Fermer();
Si MyFile. txt n'existe pas lorsque vous exécutez ce code, vous obtenez le message Impossible d'ouvrir le fichier! Mais si MyFile. txt existe, l'application l'ouvre, y ajoute la chaîne Hi et enfin la ferme.
Il s'avère que le drapeau nocreate n'est pas disponible dans la nouvelle bibliothèque standard. Bummer. Par conséquent, le code ne fonctionne que si vous utilisez une version antérieure de la bibliothèque. Lorsque vous utilisez le compilateur Code:: Blocks, vous voyez le message d'erreur suivant:
erreur: 'nocreate' n'est pas membre de '; std:: ios '
Cependant, vous voudrez tester si votre compilateur comprend une bibliothèque qui supporte ios:: nocreate.Votre compilateur peut le supporter de toute façon, même s'il inclut la nouvelle bibliothèque standard. Comme alternative à ios:: nocreate, vous pouvez utiliser le code suivant (trouvé dans l'exemple FileOutput02):
ifstream infile ("… / MyFile.txt"); if (infile. fail ()) {cout << "impossible d'ouvrir le fichier!" << endl; return 0;} infile. Fermer(); outstream du fichier ("… / MyFile.txt", ios:: app); outfile << << hi >> << endl; fichier sortant. Fermer();
Dans ce cas, vous commencez par essayer d'ouvrir le fichier pour le lire. Si le fichier n'existe pas, vous ne pouvez pas le lire et le code se termine avec un message d'échec. Si le code peut lire dans le fichier, il rouvre le fichier en écriture. C'est une solution de contournement lourde, mais cela fonctionne.
Voici une liste des drapeaux disponibles. Tout d'abord, voici ceux pour ios, dans le cas où vous utilisez un compilateur qui n'est pas complètement conforme à ANSI:
-
ios:: app: Ce drapeau signifie que vous voulez ouvrir un fichier et y ajouter.
-
ios:: in: Incluez ce drapeau si vous voulez lire dans un fichier.
-
ios:: out : Incluez ce drapeau si vous voulez écrire dans un fichier.
-
ios:: trunc : Incluez ce drapeau si vous voulez effacer le contenu du fichier avant de l'écrire. C'est le contraire de append, et c'est aussi le défaut si vous n'incluez pas spécifiquement ios:: app.
-
ios:: nocreate : Utilisez ce drapeau si vous voulez vous assurer que le fichier ne sera pas créé s'il n'existe pas, ce qui empêchera l'ouverture du fichier.
-
ios:: noreplace : Ce drapeau est l'opposé de nocreate. Utilisez ce drapeau si vous voulez seulement créer un nouveau fichier. Si vous utilisez ce drapeau et que le fichier existe déjà, le fichier ne s'ouvrira pas, et cet échec retournera true .
Les compilateurs compatibles ANSI ne supportent pas non plus l'indicateur ios:: noreplace. Dans ce cas, vous pouvez utiliser l'opposé du correctif pour l'indicateur ios: nocreate, comme indiqué ici (et trouvé dans l'exemple FileOutput03):
Dans ce cas, le code tente d'ouvrir le fichier à lire. Si le fichier existe, le code affiche un message d'erreur et se termine. Sinon, le code crée un nouveau fichier et y écrit.
Les drapeaux suivants sont disponibles dans un compilateur totalement compatible ANSI!
-
ios_base:: binary: Utilisez cet indicateur pour indiquer que le fichier que vous ouvrez contient des données binaires, c'est-à-dire des données qui ne représentent pas les chaînes de caractères.
-
ios_base:: in: Spécifie cet indicateur lorsque vous voulez lire un fichier.
-
-
ios_base:: trunc: Incluez ce drapeau si vous voulez effacer le contenu d'un fichier avant de lui écrire.
-
ios_base:: app: Incluez ce drapeau si vous souhaitez ajouter au fichier. C'est le contraire de trunc - c'est-à-dire, l'information qui est déjà dans le fichier quand vous l'ouvrez restera là.
-
Les compilateurs qui ne supportent pas encore entièrement la norme ANSI ont une classe générique dans leurs bibliothèques appelée fstream. Les compilateurs compatibles ANSI ont dans leurs bibliothèques une classe modèle appelée basic_filebuf et une classe appelée filebuf. Si vous utilisez ces classes, vous pouvez utiliser les indicateurs d'entrée et de sortie.