2017-02-19 8 views
0

J'ai appris que vous pouvez ouvrir/fermer un fichier txt et y écrire plusieurs fois (ajouter). Bien que, chaque fois que je le fais, il commence sur une nouvelle ligne. Y at-il de toute façon que je puisse revenir exactement là où le curseur s'est arrêté? Merci!Ada: Retour arrière dans le fichier texte ajouté

Répondre

5

Utilisez les flux et l'attribut de flux 'Write de type String. L'attribut indique une procédure qui affichera les données nues d'un objet chaîne.

with Ada.Streams.Stream_IO; 

procedure Write_Appending is 

    use Ada.Streams.Stream_IO; 

    F : File_Type; 

    procedure Write_Hello is 
    begin 
     String'Write (Stream (F), "Hello, "); 
    end Write_Hello; 

    procedure Write_World is 
    begin 
     String'Write (Stream (F), "World"); 
    end Write_World; 

begin 
    Create (F, Name => "Hello.txt"); 
    Write_Hello; 
    Write_World; 
    Close (F); 

    -- forgot "!", append it at the end of the file. 
    Open (F, Mode => Append_File, Name => "Hello.txt"); 
    Character'Write (Stream (F), '!'); 
    Close (F); 
end Write_Appending; 

fichier résultant

$ cat Hello.txt 
Hello, World!$ 

Notez comment la dernière ligne du fichier ne se termine pas avec une terminaison de ligne. Pour écrire à Current_Output, considérons Ada.Text_IO.Text_Streams (LRM A.12.2).

+0

Sweet! Maintenant, j'ai le problème inverse, comment puis-je effectuer un retour chariot au lieu d'écrire en continu sur une ligne? XD – Numnumberry

+0

'Character'Write' le fera. CR a une position ordinale fixe (''Pos') dans le type' Character', donc l'utilisation de '' Value' avec cette position est une façon d'ajouter CR à la sortie. Un nom plus traditionnel est 'ASCII.CR' du paquet obsolète' ASCII'. – B98

+0

J'ai pensé que trop .. mais voici mon code: écrire ("chance"); \t Ouvrir (F, Append_File, "Hello.txt"); \t Character'Write (Flux (F), ASCII.CR); \t Fermeture (F); rien ne se passe dans le fichier texte, sauf que la chance est imprimée sur une ligne quand il est exécuté plusieurs fois, je peux faire quelque chose de mal – Numnumberry

2

Oui. Utilisez un autre package d'E/S que Ada.Text_IO. Une option pourrait être d'utiliser le paquet générique Ada.Direct_IO instancié avec le type de caractère approprié.