C где хранить данные: c++ — Способы хранения данных в С++

ios — Хранение данных в приложении


Вопрос задан


Изменён
5 лет 8 месяцев назад


Просмотрен
1k раз

В приложении должны быть текстовые данные. Пробовал хранить данные в xml, но после того как я их распарсил выводиться сплошной текст без обзацев, табуляций и т.п.
В каком формате еще можно хранить данные в приложении, чтобы отображался на экране в нормальном виде?

  • ios
  • objective-c
  • xcode
  • swift
  • парсер






1

Если данных не много, можно просто выводить их файл (сериализовать). Например, NSArray и NSDictionary имеют собственные методы записи и восстановления в\из файла

- (BOOL)writeToFile:(NSString *)path 
     atomically:(BOOL)useAuxiliaryFile;
- (NSArray<ObjectType> *)arrayWithContentsOfFile:(NSString *)path;

В случае массивов(или словарей) языка Swift ситуация выглядит чуть хуже, но можно использовать plist формат (xml) и пользоваться

NSKeyedArchiver. archiveRootObject(yourArray, toFile: filePath)

и распаковать

let restoredArray = NSKeyedUnarchiver.unarchiveObject(withFile path:filePath)

ничего специально парсить не придется

Если вы хотите хранить данные в приложении iOS, лучше всего использовать SQLite (Core Data) или Realm (он проще для новичка, чем Core Data).
Соответственно вы сможете хранить текст в виде NSString.

Могу предложить еще альтернативный вариант, если у вас не очень много данных. Вы можете хранить текст прямо в NSUserDefaults.
Например вот так:

UserDefaults.standard.setValue(text_my_book, forKey: "book1")
print("\(UserDefaults.standard.value(forKey: "book1")!)")






1

Храни их в JSON. Будет удобно!






2

Для хранения текстовой информации отлично подойдет JSON и Plist файл. Все зависит от того как вы их хотите читать.

Plist файл можно распарсить в Dictionary, вообщем как и JSON, но если хардкодить данные то мне больше нравиться плист т. к. приятный интерфейс работы с ним.







Зарегистрируйтесь или войдите

Регистрация через Google

Регистрация через Facebook

Регистрация через почту

Отправить без регистрации

Почта

Необходима, но никому не показывается

Отправить без регистрации



Почта

Необходима, но никому не показывается




By clicking “Отправить ответ”, you agree to our terms of service and acknowledge that you have read and understand our privacy policy and code of conduct.


ipad — Хранение данных в OBJECTIVE-C



Задать вопрос


Вопрос задан


Изменён
9 лет 9 месяцев назад


Просмотрен
1k раз

Всегда хранил в NSUserDefaults пользовательские настройки нестрогой секретности.

Недавно случайно (а все в жизни неслучайно)))) пролистал статью о том — что данные к которым пользователь ни за что не должен получить доступ (например игровой счет в игре — количество игровых баллов) не стоит хранить в NSUserDefaults. Потому что к нему можно легко получить доступ и перебить данные

Статью пролистал поверхностно — а сейчас столкнулся с вопросом защиты переменных в приложении от возможного доступа пользователя. Так где же хранить? создавать синглтон? продолжать пользоваться NSUserDefaults? Или еще что-то?

  • ipad
  • objective-c
  • ios
  • iphone






3

К NSUserDefaults пользователь скорее всего не получит доступ, если только Вы не выводите значения явно в Настройки через preferences или если к пользователю в руки не попал .ipa-пакет Вашего приложения и у него есть хорошее желание его разобрать. В таком случае его можно разархивировать и попробовать менять данные через . plist’ы которые располагаются внутри пакета в нескомпилированном виде. Начиная с iOS7 после компиляции в бинарник помимо прочего точно собираются изображения, возможно и .plist’ы(это еще нужно будет проверить). Если так то никто никогда не доберется до Ваших настроек.






5







Зарегистрируйтесь или войдите

Регистрация через Google

Регистрация через Facebook

Регистрация через почту

Отправить без регистрации

Почта

Необходима, но никому не показывается

Отправить без регистрации



Почта

Необходима, но никому не показывается




By clicking “Отправить ответ”, you agree to our terms of service and acknowledge that you have read and understand our privacy policy and code of conduct.


c++11 — Где хранятся переменные данные в C/C++?

спросил

Изменено
2 года, 11 месяцев назад

Просмотрено
436 раз

Хотя я знаю, что макет памяти должен быть:

Текстовый сегмент : Исполняемые инструкции (я предполагаю, что машинный код в двоичном формате)

Сегмент инициализированных данных : Инициализированные глобальные и статические переменные,
если статический int a = 10; a хранится здесь, и я предполагаю, что здесь также хранится значение 10?

Сегмент неинициализированных данных : Хранит неинициализированные переменные. статический в a; «a» будет храниться здесь.

Стек : Локальные, временные переменные, рекурсивные вызовы функций, обратный адрес.

Куча : Динамическая память, выделенная переменной через malloc или realloc.

 символ *s = «привет, мир»
 

Где будет храниться переменная-указатель и строка «hello world»?

  • С++
  • С++ 11

16

Где хранятся переменные данные в C/C++?

Зависит от реализации. Вот некоторые возможные варианты:

  • В памяти
  • В регистре ЦП
  • Нигде

Хотя я знаю, что раскладка памяти должна быть…

То, что вы описываете, может относиться к некоторой архитектуре системы/процессора. Это не то, что указано в языке C++.


 символа *s = «привет, мир»
 

Где будет храниться переменная-указатель …?

Учитывая, что переменная имеет статическое хранилище, и она инициализирована, если ваше описание верно, то применимо это:

Инициализированный сегмент данных: Инициализированные глобальные и статические переменные


Где. .. будет храниться строка «hello world»?

Строковый литерал имеет статическое хранилище и инициализирован. Хотя это не переменная. Ни одно из описаний не подходит.


Кроме того, фрагмент имеет неправильный формат (начиная с C++11), поскольку строковый литерал не может быть преобразован в указатель на неконстантный char.

6

Зарегистрируйтесь или войдите в систему

Зарегистрируйтесь с помощью Google

Зарегистрироваться через Facebook

Зарегистрируйтесь, используя электронную почту и пароль

Опубликовать как гость

Электронная почта

Требуется, но никогда не отображается

Опубликовать как гость

Электронная почта

Требуется, но не отображается

Нажимая «Опубликовать свой ответ», вы соглашаетесь с нашими условиями обслуживания и подтверждаете, что прочитали и поняли нашу политику конфиденциальности и кодекс поведения.

Структура памяти программ на C

  • Читать
  • Обсудить (240+)
  • Улучшить статью

    Сохранить статью

    Нравится Статья

     

    Типичное представление памяти программы C состоит из следующих разделов.

    1. Текстовый сегмент (например, инструкции)
    2. Инициализированный сегмент данных
    3. Неинициализированный сегмент данных (bss)
    4. Куча
    5. Стек

    Типичная структура памяти запущенного процесса

    1. Текстовый сегмент: Текстовый сегмент, также известный как сегмент кода или просто текст, — это один из разделов программы в объектном файле или в памяти, который содержит исполняемые инструкции.
    В качестве области памяти текстовый сегмент может быть помещен ниже кучи или стека, чтобы предотвратить перезапись кучи и переполнения стека.

    Обычно текстовый сегмент является разделяемым, поэтому для часто выполняемых программ, таких как текстовые редакторы, компилятор C, оболочки и т. д., в памяти должна находиться только одна копия. Кроме того, текстовый сегмент часто доступен только для чтения, чтобы программа не могла случайно изменить свои инструкции.

    2. Сегмент инициализированных данных:  Инициализированный сегмент данных, обычно называемый просто сегментом данных. Сегмент данных — это часть виртуального адресного пространства программы, которая содержит глобальные и статические переменные, инициализируемые программистом.
    Обратите внимание, что сегмент данных доступен не только для чтения, поскольку значения переменных могут быть изменены во время выполнения.
    Этот сегмент можно разделить на инициализированную область только для чтения и инициализированную область чтения-записи.
    Например, глобальная строка, определенная как char s[] = «hello world» в C, и оператор C, такой как int debug=1 вне основного (т. е. глобального), будет храниться в инициализированной области чтения-записи. И глобальный оператор C, такой как const char* string = «hello world», сохраняет строковый литерал «hello world» в инициализированной области только для чтения, а строку переменной указателя символа — в инициализированной области чтения-записи.
    Пример: статический int i = 10 будет храниться в сегменте данных, а глобальный int i = 10 также будет храниться в сегменте данных

    3. Неинициализированный сегмент данных:  Неинициализированный сегмент данных, часто называемый сегментом « bss ». , названный в честь древнего оператора ассемблера, который обозначал «блок , начинающийся с символа ». Данные в этом сегменте инициализируются ядром арифметическим 0 до того, как программа начнет выполнение неинициализированных данных, начинающихся в конце сегмента данных и содержащих все глобальные переменные и статические переменные, которые инициализированы нулем или не имеют явной инициализации в исходном коде.
    Например, переменная, объявленная как static int i; будет содержаться в сегменте BSS.
    Например, объявлена ​​глобальная переменная int j; будет содержаться в сегменте BSS.

    4. Стек:  Область стека традиционно примыкала к области кучи и росла в противоположном направлении; когда указатель стека встречался с указателем кучи, свободная память была исчерпана. (С современными большими адресными пространствами и технологиями виртуальной памяти они могут быть размещены почти где угодно, но обычно они растут в противоположных направлениях.)
    Область стека содержит программный стек, структуру LIFO, обычно расположенную в старших частях памяти. В стандартной компьютерной архитектуре PC x86 он увеличивается до нулевого адреса; на некоторых других архитектурах он растет в противоположном направлении. Регистр «указатель стека» отслеживает вершину стека; он корректируется каждый раз, когда значение «помещается» в стек. Набор значений, передаваемых для одного вызова функции, называется «фреймом стека»; Кадр стека состоит как минимум из адреса возврата.
    Стек, в котором хранятся автоматические переменные вместе с информацией, сохраняемой при каждом вызове функции. Каждый раз, когда вызывается функция, в стеке сохраняется адрес возврата и определенная информация о среде вызывающего объекта, например, некоторые регистры машины. Затем вновь вызванная функция выделяет место в стеке для своих автоматических переменных. Вот как могут работать рекурсивные функции в C. Каждый раз, когда рекурсивная функция вызывает сама себя, используется новый кадр стека, поэтому один набор переменных не пересекается с переменными из другого экземпляра функции.

    5. Куча:  Куча — это сегмент, в котором обычно происходит динамическое выделение памяти.
    Область кучи начинается в конце сегмента BSS и оттуда увеличивается до более крупных адресов. Область кучи управляется функциями malloc, realloc и free, которые могут использовать системные вызовы brk и sbrk для настройки своего размера (обратите внимание, что использование brk/sbrk и одной «области кучи» не требуется для выполнения контракта malloc/realloc/free; они также могут быть реализованы с использованием mmap для резервирования потенциально несмежных областей виртуальной памяти в виртуальном адресном пространстве процесса). Область кучи совместно используется всеми разделяемыми библиотеками и динамически загружаемыми модулями в процессе.

    Примеры: 

    Команда size(1) сообщает размеры (в байтах) сегментов текста, данных и bss. (для получения более подробной информации см. справочную страницу размера (1))

    1. Проверьте следующую простую программу C 

    C

    #include

     

    целое число основной( пустота )

    {

         возврат 0;

    }

     [narendra@CentOS]$ gcc memory-layout.c -o memory-layout
    [narendra@CentOS]$ размер макета памяти
    текстовые данные bss dec шестнадцатеричное имя файла
    960 248 8 1216 4c0 memory-layout 

    2. Добавим в программу одну глобальную переменную, теперь проверим размер bss (выделено красным).

    C

    #include h>

     

    целое число глобальный;

     

    внутр. основной( недействительный )

    {

    900 42      возврат 0;

    }

     [narendra@CentOS]$ gcc memory-layout.c -o memory-layout
    [narendra@CentOS]$ размер макета памяти
    текстовые данные bss dec шестнадцатеричное имя файла
     960 248  12  1220 4c4 memory-layout 

    3. Добавим одну статическую переменную, которая также хранится в bss.

    C

    #include

     

    int global;

     

    внутр. основной( недействительный )

    {

    900 42      статический int i;

         возврат 0;

    }

     [narendra@CentOS]$ gcc memory-layout. c -o memory-layout
    [narendra@CentOS]$ размер макета памяти
    текстовые данные bss dec шестнадцатеричное имя файла
     960 248  16  1224 4c8 memory-layout 

    4. Инициализируем статическую переменную, которая затем будет храниться в сегменте данных (DS)

    C

    #include

     

    int global;

     

    внутр. основной( недействительный )

    {

    900 42      статический int i = 100;

         возврат 0;

    }

     [narendra@CentOS]$ gcc memory-layout.c -o memory-layout
    [narendra@CentOS]$ размер макета памяти
    текстовые данные bss dec шестнадцатеричное имя файла
    960  252 12  1224 4c8 memory-layout 

    5.

    Читайте также: