2016-07-18 2 views
-2

Je suis en train d'écrire dans un fichier en Common Lisp, mais je continue à obtenir une erreur « fichier n'est pas un flux »:Clisp Erreur: PRINC: argument n'est pas un flux

[1]> (open "file.txt" :direction :output :if-does-not-exist :create :if-exists :supersede) 
#<output buffered file-stream character #P"file.txt"> 
[2]> (princ 'Hello "file.txt") 

*** - princ: argument "file.txt" is not a stream 

Même essayer de fermez le fichier renvoie une erreur:

[4]> (close "file.txt") 

*** - no-applicable-method: When calling #<standard-generic-function close> 
with arguments ("file.txt"), no method is applicable. 

le fichier a été créé correctement, donc je pense qu'il pourrait être un problème d'autorisations, mais cela ne semble pas que ce soit. J'ai googlé cette erreur sans aucune chance jusqu'à présent. Est-ce que quelqu'un sait ce que je fais mal? Je vous remercie.

PS: Je suis sous Linux Mint 17,3 Rosa avec CLISP 2,49 (2010-07-07)

Répondre

6

Pour utiliser les fichiers ouverts, vous devez enregistrer la valeur de retour de open et utilise comme second argument à princ . Vous devez également utiliser cette même valeur de retour comme argument pour close.

Ceci est généralement fait avec la macro de commodité with-open-file. Le files chapter of Practical Common Lisp montre comment utiliser ces fonctions et macros.

+0

Merci beaucoup! J'ai lu à propos de 'with-open-file', mais je ne crois pas que je suis autorisé à l'utiliser pour mon travail. Donc à la place je l'ai fait: '(fichier setq (ouvrir" fichier.txt ": direction: sortie: if-does-not-exists: créer: si-existe: supersede)) (princ 'Bonjour fichier) (fermer fichier) ' Qui a bien fonctionné. – LePoufCelebre

+1

@LePoufCelebre Notez que ce n'est pas vraiment différent de tout autre langage de programmation. En C, par exemple, vous feriez 'int fd = open (" foo.txt ", ...); write (fd, ...); 'not' open ("foo.txt", ...); write ("foo.txt", ...); '. Ou en Java, vous feriez 'FileOutputStream out = new FileOutputStream (" foo.txt "); out.write (...) ', pas' FileOutputStream out = nouveau FIleOutputStream ("foo.txt"); "foo.txt" .write (...); '. –

+0

Merci @JoshuaTaylor, je ne le savais pas. – LePoufCelebre