2009-07-15 5 views
7

Par exemple, je veux écrire une valeur de chaîne, str, dans un fichier, "yy", car il change à travers chaque itération d'une boucle. Ci-dessous, comment je suis actuellement mise en œuvre:Quelle est l'approche typique pour écrire des objets NSString dans un fichier?

NSOutputStream *oStream = [[NSOutputStream alloc] initToFileAtPath:@"yy" append:NO]; 
[oStream open]; 

while (...) 
{ 

    NSString *str = /* has already been set up */ 

    NSData *strData = [str dataUsingEncoding:NSUTF8StringEncoding]; 
    [oStream write:r(uint8_t *)[strData bytes] maxLength:[strData length]]; 

    ... 
} 

[oStream close]; 

Ignorer l'encodage UTF-8, que je ne demande, est-ce ainsi que NSString s sont généralement écrits dans un fichier? C'est-à-dire en convertissant d'abord en un objet NSData, puis en utilisant bytes et en convertissant le résultat en uint8_t pour NSOutputStream?

Y at-il des alternatives qui sont utilisées plus souvent?

EDIT: Plusieurs NSString s doivent être ajoutés au même fichier, d'où la boucle ci-dessus.

Répondre

13

solution de ctshryock est un peu différente de la vôtre, puisque vous annexant que vous allez, et ctshyrock Rédigeons un seul fichier à la fois (en remplaçant la version précédente). Pour un processus de longue durée, ceux-ci vont être radicalement différents.

Si vous voulez écrire au fur et à mesure, j'utilise généralement NSFileHandle ici plutôt que NSOutputStream. C'est juste un peu plus facile à utiliser à mon avis.

NSFileHandle *fileHandle = [NSFileHandle fileHandleForWritingAtPath:aPath]; 
while (...) 
{ 
    NSString *str = /* has already been set up */ 

    [fileHandle writeData:[str dataUsingEncoding:NSUTF8StringEncoding]]; 
} 

[fileHandle closeFile]; 

Notez que fileHandle se fermera automatiquement quand il est dealloced, mais je tiens à aller de l'avant et fermez explicitement quand je suis fait avec elle.

+0

Est-ce également le cas que fileHandleForWritingAtPath nécessite que le fichier existe déjà? –

+0

Non, il va créer un nouveau fichier dans tous les cas (en supprimant l'ancien s'il en existe déjà un). Voir les documents NSFileHandle pour plus de détails sur les autres constructeurs pouvant être ajoutés aux fichiers existants. –

+0

En tant que débutant Cocoa, je suis venu ici pour plus d'informations, j'ai essayé ceci, et 'fileHandleForWritingAtPath' m'a toujours donné' null' pour les fichiers inexistants. J'ai dû utiliser POSIX 'open()' avec 'O_CREAT' pour créer le fichier en premier. Est-ce que quelqu'un a des informations à ce sujet, s'il vous plaît? –

4

J'utilise généralement les méthodes de NSString writeToFile:atomically:encoding:error: ou writeToURL:atomically:encoding:error: pour écrire dans un fichier.

Voir la String Programming Guide for Cocoa pour plus d'infos

+0

La question ne concerne pas l'écriture one-shot, mais plutôt l'écriture incrémentale (ajout) d'une chaîne dans un fichier à l'intérieur d'une boucle. –

+2

vraiment? sa question est "est-ce comment NSStrings sont typiquement écrits dans un fichier". son exemple ne correspond pas tout à fait à sa question. – catsby

Questions connexes