2009-07-15 19 views
7

Ví dụ, tôi muốn viết ra một số giá trị chuỗi, str, vào một tệp, "yy", vì nó thay đổi thông qua mỗi lần lặp của một vòng lặp. Dưới đây là cách tôi đang thực hiện điều đó:Cách tiếp cận điển hình được thực hiện để viết các đối tượng NSString vào một tệp là gì?

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]; 

Bỏ qua bảng mã UTF-8, mà tôi đòi hỏi, là thế này thế nào NSString s thường được ghi vào một tập tin? Tức là, trước hết chuyển đổi thành đối tượng NSData, sau đó sử dụng bytes và truyền kết quả đến uint8_t cho NSOutputStream 's write?

Có các lựa chọn thay thế nào được sử dụng thường xuyên hơn không?

EDIT: Nhiều NSString s cần được nối vào cùng một tệp, do đó vòng lặp ở trên.

Trả lời

13

giải pháp ctshryock là một chút khác nhau hơn của bạn, vì bạn đang phụ thêm như bạn đi, và ctshyrock viết một tập tin duy nhất cùng một lúc (ghi đè lên các phiên bản trước). Đối với một quy trình chạy dài, chúng sẽ hoàn toàn khác nhau.

Nếu bạn muốn viết như bạn đi, tôi thường sử dụng NSFileHandle tại đây thay vì NSOutputStream. Nó chỉ là một chút dễ dàng hơn để sử dụng trong quan điểm của tôi.

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

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

[fileHandle closeFile]; 

Lưu ý rằng fileHandle sẽ tự động đóng khi nó được dealloced, nhưng tôi muốn đi trước và đóng nó lại một cách rõ ràng khi tôi đang làm với nó.

+0

Có phải trường hợp tệpHandleForWritingAtPath yêu cầu tệp đó đã tồn tại không? –

+0

Không, nó sẽ tạo ra một tệp mới trong mọi trường hợp (loại bỏ tệp cũ nếu đã tồn tại). Xem tài liệu NSFileHandle để biết chi tiết về các hàm tạo khác có thể nối thêm vào các tệp hiện có. –

+0

Là một người mới bắt đầu Cocoa, tôi đến đây để biết thông tin, đã thử điều này, và 'fileHandleForWritingAtPath' luôn cho tôi' null' cho các tệp không tồn tại. Tôi đã phải sử dụng một POSIX 'open()' với 'O_CREAT' để tạo tệp đầu tiên. Có ai có làm rõ thông tin về điều này không? –

4

Tôi thường sử dụng phương pháp NSString writeToFile:atomically:encoding:error: hoặc writeToURL:atomically:encoding:error: để ghi vào tệp.

Xem String Programming Guide for Cocoa để biết thêm

+0

Câu hỏi không phải là viết một văn bản, mà là viết thêm (nối thêm) của một chuỗi vào một tệp trong vòng lặp. –

+2

thực sự? câu hỏi của ông là "đây là cách NSStrings thường được ghi vào một tập tin". ví dụ của anh ta không hoàn toàn phù hợp với câu hỏi của anh ta. – catsby

Các vấn đề liên quan