我浏览了一下,试图找到一个简单的方法,首先将一个MutableArray(它将包含来自UITextViews的不同文本数组,带有返回等)保存到txt文件中,然后将txt文件加载回我的MutableArray
我没有设法提出反向方法(加载文本文件),并想知道我应该怎么做。我确定txt文件和可变数组并不真正兼容,特别是如果我想让MutableArray从UITextViews中保存各种文本字符串。
有没有办法在可变数组中标记一个部分的开头,在txt文件中标记下一个部分的开头?目的是能够在程序和简单的文本编辑器中编辑txt文件,而不会弄乱可变数组的结构。
我可以在文本文件中使用某个特殊字符(显然不是\ n)来分隔不同的对象吗?
到目前为止,我已经提出了这个问题。对不起,我是初学者,非常基础。第一个问题是我收到错误消息'NSMutableArray'可能没有响应'-writeToFile:atomically:encoding:error:'。接下来,我不知道如何将txt加载回我的数组。最后,我想提出一种方法来分离txt中的数组,使其保持可编辑状态,但那将是绝对的结冰。也许解决方案是将一个数组中的每个Object保存在一个单独的txt文件中,然后将每个txt加载到数组中?
// GENERATE ARRAY
NoteBook = [[NSMutableArray alloc] init];
for (int temp = 0; temp < 3; temp++) {
[NoteBook insertObject:@"Title\n\n Line1\nLine2..." atIndex:temp];
}
// SAVING MY MUTABLE ARRAY
NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
NSString *documentsDirectory = [paths objectAtIndex:0]; // Get documents directory
NSError *error;
BOOL succeed = [NoteBook writeToFile:[documentsDirectory stringByAppendingPathComponent:@"myfile.txt"]
atomically:YES encoding:NSUTF8StringEncoding error:&error];
if (!succeed){
// Handle error here
}
// LOADING TEXTFILE AND PUT IT INTO A MUTABLE ARRAY
// NO IDEA... how to do this
答案 0 :(得分:3)
使用例如
将数组转换为字符串,反之亦然NSString* arrayText = [NoteBook componentsJoinedByString: @"<your-favourite-separator-string>"];
使用[arrayText writeToFile ...]
写入文件从文件中读回字符串后,使用
Notebook = [arrayText componentsSeparatedByString: @"<your-favourite-separator-string>"];
最后,不要这样做。将数组直接保存到属性列表(阅读那些)或JSON或其他一些结构化数据格式。
答案 1 :(得分:2)
为什么不将可变数组转换为JSON并将该字符串写入文件?反过来是从文件中读取字符串并使用JSON解析器返回到数组。 json-framework非常易于使用。
只要您编写有效的JSON,就可以通过编辑文本文件来创建或修改数组。
答案 2 :(得分:2)
从文件中检索数组
NSArray *theCatalogInfo=nil;
NSString *theCatalogFilePath = [NSString stringWithFormat:@"%@/Documents/",NSHomeDirectory()];
theCatalogFilePath = [theCatalogFilePath stringByAppendingString:kCatalogCachePath];
if(nil!=theCatalogFilePath)
{
theCatalogInfo=[[NSArray alloc]initWithContentsOfFile:theCatalogFilePath];
}
将数组保存到文件
NSString *theCatalogFilePath = [NSString stringWithFormat:@"%@/Documents/",NSHomeDirectory()];
theCatalogFilePath = [theCatalogFilePath stringByAppendingString:kCatalogCachePath];
[**YourArray** writeToFile:theCatalogFilePath atomically:YES];
答案 3 :(得分:0)
查看以下三种方法来创建文本文件,写入文件并从中读取数据。 关键是存储由空格分隔的不同对象。你应该很简单。
-(void)createFile
{
NSArray *paths = NSSearchPathForDirectoriesInDomains
(NSDocumentDirectory, NSUserDomainMask, YES);
NSString *documentsDirectory = [paths objectAtIndex:0];
NSString *filePath = [documentsDirectory stringByAppendingPathComponent:@"Sample.txt"];
NSFileManager * file_manager = [NSFileManager defaultManager];
if(![file_manager fileExistsAtPath:filePath])
{
[file_manager createFileAtPath:filePath contents:nil attributes:nil];
NSString *content = @"NULL NULL NULL";
[content writeToFile:filePath
atomically:NO
encoding:NSStringEncodingConversionAllowLossy
error:nil];
}
}
-(void)writeToFile
{
NSArray *paths = NSSearchPathForDirectoriesInDomains
(NSDocumentDirectory, NSUserDomainMask, YES);
NSString *documentsDirectory = [paths objectAtIndex:0];
NSString *filePath = [documentsDirectory stringByAppendingPathComponent:@"Sample.txt"];
NSString *content = [NSString stringWithFormat:@"%@ %@ %@", obj1, obj2, obj3];
[content writeToFile:filePath
atomically:NO
encoding:NSStringEncodingConversionAllowLossy
error:nil];
}
-(void)readFromFile
{
objects = [[NSArray alloc] init];
NSArray *paths = NSSearchPathForDirectoriesInDomains
(NSDocumentDirectory, NSUserDomainMask, YES);
NSString *documentsDirectory = [paths objectAtIndex:0];
NSString *filePath = [documentsDirectory stringByAppendingPathComponent:@"Sample.txt"];
if (filePath) {
NSString *myText = [NSString stringWithContentsOfFile:filePath encoding:NSASCIIStringEncoding error:nil];
if (myText) {
objects = [myText componentsSeparatedByString:@" "];
}
}
}
答案 4 :(得分:0)
如果您的nsarray包含nsdictionary,nsarray,nsstring,nsnumber,nsdata或nsdate对象(没有自定义对象,int等),您只需将可变数组的内容写入plist文件即可。
这将维护您拥有的数据结构,您只需将数据直接读入数组即可。我在几个数据类中的表现是
NSArray *tempArray = [NSArray arrayWithContentsOfFile:[Utils getFileLocation]];
if (tempArray == nil) {
yourArray = [[NSMutableArray alloc] init];
} else {
yourArray = [[NSArray deepMutableCopy:tempArray] retain];
}