Objective C: Чтение файла линию за линией

Хотя использование гравитации работает для TextView, есть альтернативный метод, реализованный на уровне API 17 -

textView.setTextAlignment(View.TEXT_ALIGNMENT_CENTER);

Не знаю разницы, но он тоже работает. Однако только для уровня API 17 или выше.

138
задан Quinn Taylor 25 June 2009 в 18:02
поделиться

6 ответов

Отличный вопрос. Я думаю, что у @Diederik есть хороший ответ, хотя, к сожалению, у Cocoa нет механизма для того, что вы хотите делать.

NSInputStream позволяет вам читать блоки размером N байтов ( очень похоже на java.io.BufferedReader ), но вы должны преобразовать его в NSString самостоятельно, затем просканировать новые строки (или любой другой разделитель) и сохранить оставшиеся символы для следующего чтения или прочитайте больше символов, если перевод строки еще не прочитан. ( NSFileHandle позволяет вам читать NSData , который затем можно преобразовать в NSString , но по сути это тот же процесс.)

У Apple есть ] Руководство по программированию потоковой передачи , которое поможет уточнить детали, и этот вопрос SO также может помочь, если вы собираетесь иметь дело с буферами uint8_t * .

Если вы собираетесь часто читать подобные строки (особенно в разных частях вашей программы) было бы неплохо инкапсулировать это поведение в классе, который может обрабатывать детали за вас, или даже создать подкласс NSInputStream (он предназначен для подкласса ) и добавление методов, которые позволяют читать именно то, что вы хотите.

Для записи, я думаю, что это было бы неплохо добавить, и я буду подавать запрос на улучшение того, что делает это возможным. : -)


Редактировать: Оказывается, этот запрос уже существует. Для этого есть радар 2006 года (rdar: // 4742914 для сотрудников Apple).

re будет иметь дело с буферами uint8_t * .

Если вы собираетесь часто читать подобные строки (особенно в различных частях вашей программы), было бы неплохо инкапсулировать это поведение в классе, который может обрабатывать детали за вас, или даже в подклассе NSInputStream (он предназначен для подкласса ) и добавлении методов, которые позволяют вам читать именно то, что вы хотите.

Для протокола, я думаю, что было бы неплохо добавить эту функцию, и я буду подавать запрос на улучшение чего-то, что делает это возможным. : -)


Редактировать: Оказывается, этот запрос уже существует. Для этого есть радар 2006 года (rdar: // 4742914 для сотрудников Apple).

re будет иметь дело с буферами uint8_t * .

Если вы собираетесь часто читать подобные строки (особенно в различных частях вашей программы), было бы неплохо инкапсулировать это поведение в классе, который может обрабатывать детали за вас, или даже в подклассе NSInputStream (он предназначен для подкласса ) и добавлении методов, которые позволяют вам читать именно то, что вы хотите.

Для протокола, я думаю, что было бы неплохо добавить эту функцию, и я буду подавать запрос на улучшение чего-то, что делает это возможным. : -)


Редактировать: Оказывается, этот запрос уже существует. Для этого есть радар 2006 года (rdar: // 4742914 для сотрудников Apple).

Если вы собираетесь часто читать подобные строки (особенно в разных частях вашей программы), было бы неплохо инкапсулировать это поведение в классе, который может обрабатывать детали за вас, или даже создать подкласс NSInputStream ( он предназначен для создания подклассов ) и добавляет методы, позволяющие читать именно то, что вы хотите.

Для записи, я думаю, что это было бы неплохо добавить, и я подам запрос на улучшение чего-то, что делает это возможным. : -)


Редактировать: Оказывается, этот запрос уже существует. Для этого есть радар 2006 года (rdar: // 4742914 для сотрудников Apple).

Если вы собираетесь часто читать подобные строки (особенно в разных частях вашей программы), было бы неплохо инкапсулировать это поведение в классе, который может обрабатывать детали за вас, или даже создать подкласс NSInputStream ( он предназначен для создания подклассов ) и добавляет методы, позволяющие читать именно то, что вы хотите.

Для записи, я думаю, что это было бы неплохо добавить, и я подам запрос на улучшение чего-то, что делает это возможным. : -)


Редактировать: Оказывается, этот запрос уже существует. Для этого есть радар 2006 года (rdar: // 4742914 для сотрудников Apple).

Для записи, я думаю, что было бы неплохо добавить эту функцию, и я буду подавать запрос на улучшение чего-то, что делает это возможным. : -)


Редактировать: Оказывается, этот запрос уже существует. Для этого есть радар 2006 года (rdar: // 4742914 для сотрудников Apple).

Для записи, я думаю, что было бы неплохо добавить эту функцию, и я буду подавать запрос на улучшение чего-то, что делает это возможным. : -)


Редактировать: Оказывается, этот запрос уже существует. Для этого есть радар 2006 года (rdar: // 4742914 для сотрудников Apple).

63
ответ дан 23 November 2019 в 23:28
поделиться

Вы можете использовать NSInputStream , который имеет базовую реализацию для файловых потоков. Вы можете читать байты в буфер (метод read: maxLength: ). Вы должны сами сканировать буфер на предмет новых строк.

9
ответ дан 23 November 2019 в 23:28
поделиться

Это НЕ ObjC, а C.

Поскольку ObjC основан на 'C', почему бы не использовать fgets?

И да, я уверен, что у ObjC есть собственный метод - Я просто еще недостаточно разбираюсь в этом, чтобы знать, что это такое :)

1
ответ дан 23 November 2019 в 23:28
поделиться

Это должно помочь:

#include <stdio.h>

NSString *readLineAsNSString(FILE *file)
{
    char buffer[4096];

    // tune this capacity to your liking -- larger buffer sizes will be faster, but
    // use more memory
    NSMutableString *result = [NSMutableString stringWithCapacity:256];

    // Read up to 4095 non-newline characters, then read and discard the newline
    int charsRead;
    do
    {
        if(fscanf(file, "%4095[^\n]%n%*c", buffer, &charsRead) == 1)
            [result appendFormat:@"%s", buffer];
        else
            break;
    } while(charsRead == 4095);

    return result;
}

Используйте следующее:

FILE *file = fopen("myfile", "r");
// check for NULL
while(!feof(file))
{
    NSString *line = readLineAsNSString(file);
    // do stuff with line; line is autoreleased, so you should NOT release it (unless you also retain it beforehand)
}
fclose(file);

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

Примечание : Я не тестировал этот код. Пожалуйста, проверьте его перед использованием.

34
ответ дан 23 November 2019 в 23:28
поделиться

Соответствующий способ чтения текстовых файлов в Cocoa / Objective-C задокументирован в руководстве Apple по программированию String. Раздел для чтения и записи файлов должен быть именно тем, что вам нужно. PS: Что такое «линия»? Две части строки, разделенные "\ n"? Или "\ r"? Или "\ r \ n"? Или, может быть, вы действительно после абзацев? Ранее упомянутое руководство также включает раздел о разделении строки на строки или абзацы. (Этот раздел называется «Абзацы и разрывы строк», и ссылка на него находится в левом меню страницы, на которую я указал выше. К сожалению, этот сайт не позволяет мне публиковать более одного URL-адреса, поскольку я пока не заслуживающий доверия пользователь.)

Перефразируя Кнута: преждевременная оптимизация - корень всех зол. Дон' просто предположить, что «чтение всего файла в память» происходит медленно. Вы проверили это? Вы знаете, что он на самом деле считывает весь файл в память? Может быть, он просто возвращает прокси-объект и продолжает читать за кулисами, пока вы потребляете строку? ( Отказ от ответственности: я понятия не имею, действительно ли это делает NSString. Вероятно, может. ) Суть в следующем: сначала используйте задокументированный способ выполнения действий. Затем, если тесты покажут, что это не дает желаемой производительности, произведите оптимизацию.

Понятия не имею, действительно ли это делает NSString. Возможно, это могло бы быть. ) Суть в том, что сначала используйте задокументированный способ работы. Затем, если тесты покажут, что это не дает желаемой производительности, произведите оптимизацию.

Понятия не имею, действительно ли это делает NSString. Возможно, это могло бы быть. ) Суть в том, что сначала используйте задокументированный способ работы. Затем, если тесты покажут, что это не дает желаемой производительности, произведите оптимизацию.

6
ответ дан 23 November 2019 в 23:28
поделиться

Mac OS X - это Unix, Objective-C - это надмножество C, поэтому вы можете просто использовать устаревшие fopen и fgets из . Гарантированно сработает.

[NSString stringWithUTF8String: buf] преобразует строку C в NSString . Также существуют методы создания строк в других кодировках и создания без копирования.

12
ответ дан 23 November 2019 в 23:28
поделиться
Другие вопросы по тегам:

Похожие вопросы: