Сохранение NSMutableArray в txt-файл / Загрузка txt-файла обратно в NSMutableArray - PullRequest
0 голосов
/ 22 марта 2011

Я осмотрелся, пытаясь найти простой метод для первого сохранения MutableArray (который будет содержать различные текстовые массивы из UITextViews с возвратами и т. Д.) В txt-файл, а затем загрузил txt-файл обратно в мой MutableArray.

Мне не удалось придумать обратный метод (загрузка текстового файла), и мне было интересно, как мне это сделать.Я уверен, что txt-файлы и изменяемые массивы на самом деле не совместимы, особенно если я хочу, чтобы MutableArray содержал различные текстовые строки из UITextViews.

Есть ли способ отметить начало одного раздела в изменяемом массиве иначало следующего в текстовом файле?Цель состоит в том, чтобы иметь возможность редактировать текстовый файл как в программе, так и в простом текстовом редакторе, не нарушая структуру изменяемого массива.

Могу ли я использовать определенный специальный символ (не \ n, очевидно,) в моем текстовом файле, чтобы разделить разные объекты?

Вот то, что я придумал до сих пор.Извините, я новичок, и это очень просто.Первая проблема заключается в том, что я получаю сообщение об ошибке «NSMutableArray» может не отвечать на «-writeToFile: atomically: encoding: error:».Далее я понятия не имею, как загрузить текст обратно в мой массив.Наконец, я хотел бы предложить способ разделения массивов в текстовом формате, чтобы он оставался редактируемым, но это было бы абсолютным обледенением.Возможно, решением было бы сохранить каждый объект в массиве в отдельном текстовом файле, а затем загрузить каждый текст в массив?

// 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

Ответы [ 5 ]

3 голосов
/ 22 марта 2011

Преобразуйте ваши массивы в строки и наоборот, используя, например,

NSString* arrayText = [NoteBook componentsJoinedByString: @"<your-favourite-separator-string>"];

запись в файл с помощью [arrayText writeToFile ...]

После чтения строки изфайл, используйте

Notebook = [arrayText componentsSeparatedByString: @"<your-favourite-separator-string>"];

Наконец, не делайте этого.Сохраните ваш массив непосредственно в списке свойств (прочитайте о них) или в формате JSON или в другом формате структурированных данных.

2 голосов
/ 22 марта 2011
  1. делает NSMutableArray для NSArray. Потому что NSMutableArray не имеет writeToFile.
  2. извлекает массив из файла

    NSArray *theCatalogInfo=nil;
    NSString *theCatalogFilePath = [NSString stringWithFormat:@"%@/Documents/",NSHomeDirectory()];
    theCatalogFilePath = [theCatalogFilePath stringByAppendingString:kCatalogCachePath];
    if(nil!=theCatalogFilePath)
    {
        theCatalogInfo=[[NSArray alloc]initWithContentsOfFile:theCatalogFilePath];
    }
    
  3. Сохранить массив в файл

    NSString *theCatalogFilePath = [NSString stringWithFormat:@"%@/Documents/",NSHomeDirectory()];
    theCatalogFilePath = [theCatalogFilePath stringByAppendingString:kCatalogCachePath];
    
    [**YourArray** writeToFile:theCatalogFilePath atomically:YES];
    
2 голосов
/ 22 марта 2011

Почему бы просто не превратить изменяемый массив в JSON и записать эту строку в файл? Обратным является чтение строки из файла и обратное преобразование в массив с использованием анализатора JSON. json-framework очень прост в использовании.

Преимущество состоит в том, что вы можете создавать или изменять свой массив, редактируя текстовые файлы, пока вы пишете действительный JSON.

0 голосов
/ 22 марта 2011

если ваш 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];
}
0 голосов
/ 22 марта 2011

Взгляните на следующие три метода для создания текстового файла, записи в него и считывания данных из него.Ключ должен хранить различные объекты, разделенные пробелом.И вы должны получить это очень просто.

-(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:@" "];
        }
    }

}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...