2011-10-13 109 views
0

分隔的文件,我發現這個片段在網上寫,然後將數據追加到一個文本文件:創建標籤在Objective-C

- (void)appendText:(NSString *)text toFile:(NSString *)filePath { 

    // NSFileHandle won't create the file for us, so we need to check to make sure it exists 
    NSFileManager *fileManager = [NSFileManager defaultManager]; 
    if (![fileManager fileExistsAtPath:filePath]) { 

     // the file doesn't exist yet, so we can just write out the text using the 
     // NSString convenience method 

     NSError *error = noErr; 
     BOOL success = [text writeToFile:filePath atomically:YES encoding:NSUTF8StringEncoding error:&error]; 
     if (!success) { 
      // handle the error 
      NSLog(@"%@", error); 
     } 

    } 
    else { 

     // the file already exists, so we should append the text to the end 

     // get a handle to the file 
     NSFileHandle *fileHandle = [NSFileHandle fileHandleForWritingAtPath:filePath]; 

     // move to the end of the file 
     [fileHandle seekToEndOfFile]; 

     // convert the string to an NSData object 
     NSData *textData = [text dataUsingEncoding:NSUTF8StringEncoding]; 

     // write the data to the end of the file 
     [fileHandle writeData:textData]; 

     // clean up 
     [fileHandle closeFile]; 
    } 
} 

這對我來說很有意義。我有一個有3個屬性的類,NSString,NSInteger和NSString。當我嘗試使用這種方法時,我這樣做:

for (MyObject *ref in array) { 
    NSString *stringToFile = [NSString stringWithFormat:@"%@\t%i\t%@", ref.ChrID, ref.Position, ref.Sequence]; 
    [self appendText:stringToFile toFile:filePath]; 
} 

它看起來不太正確。我的數據如下所示:

NSString *tab* NSInteger *single space* NSStringNSString *tab* NSInteger newline 
NSStringNSString *tab* NSInteger newline 
NSStringNSString *tab* NSInteger newline 
NSStringNSString *tab* NSInteger newline 
NSStringNSString *tab* NSInteger newline 
NSStringNSString *tab* NSInteger newline 
NSStringNSString *tab* NSInteger newline 
NSStringNSString *tab* NSInteger newline 
... 

我不確定發生了什麼事情來使它看起來像這樣。當我NSLog數據,它看起來很好。但是,第一行的東西會搞砸,然後一切都會消失。有什麼想法嗎?謝謝。

+2

首先,在格式化字符串的末尾加上換行符(\ n)。您可能需要一對\ r \ n。 – Flyingdiver

+0

另外,MyObject的聲明是什麼? – Flyingdiver

+1

@Flyingdiver據我所知,在Windows上需要'\ r \ n'對,但不是任何基於Unix的文件系統(包括OS X和iOS),儘管大多數Unix系統都能容忍它們。 – jlehr

回答

1

沒有與方法appendText幾個問題:

  • 如果文件不存在,第一行寫有NSString的writeToFile方法沒有\ n

  • 以下行被寫入與NSData writeData方法

  • 它是非常低效的使用filemanager檢查存在,獲取文件句柄,尋求EOF,然後只寫一個李ne,省略了關閉。併爲每一條下面的行重複這一點。

因此,更好地做到這一點是這樣的:

  • 獲得書面文件句柄,它將被創建,如果它不存在尚未

  • 尋求EOF

  • 做你的循環與每行writeData的數據

  • cl其他文件