Выделение памяти для массива символов

У меня большая проблема с языком C, когда дело касается строк, char * или чего-то еще … Так что в этом конкретном случае у меня огромная проблема. Я хочу создать массив символов и пока не знаю, какого он будет размера. Я хочу написать что-то вроде этого:

  char test [];  

Но после этого, когда я буду знать, как там будет много элементов, я хочу написать что-то вроде этого:

  char test [num_of_elements];  

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


26

Объявление массивов статических символов (строк)

Когда вы знаете (или имеете разумное представление о том, насколько большим должен быть ваш массив, вы можете просто объявить массив достаточного размера для обработки вашего ввода (т. е. если ваши имена не длиннее 25 символов, тогда вы можете безопасно объявить name [26] . Для строк вам всегда нужно как минимум количество сохраняемых символов + 1 (для завершающего нуля символа ).

Если может быть несколько символов больше 25, нет ничего плохого в том, чтобы объявить ваш массив на несколько байтов длиннее, чем необходимо для защиты от случайной записи за пределы массива. Скажите name [32] .

Давайте объявим массив из 5-символов b Ниже и посмотрите, как информация хранится в памяти.

  char name [5] = {0}; /* всегда инициализируйте ваши массивы */ 

Приведенное выше объявление создает массив из 5-подрядных байтов в стеке для вашего использования. например, вы можете визуализировать 5-байтовую память, инициализированную нулем, следующим образом:

  + --- + --- + --- + --- + -  - + имя |  0 |  0 |  0 |  0 |  0 |  + --- + --- + --- + --- + --- +  'name' содержит начальный адрес блока памяти, который является массивом (то есть адрес первого элемента, например: 0x7fff050bf3d0)   

Примечание: при использовании name для хранения «символьной строки» фактическая строка может быть не длиннее, чем 4 , потому что вы должны заканчивать строку с помощью завершающего нуля символа , который является нулевым символом ' 0' (или просто числовой 0 , оба эквивалентны)

Для хранения информации в name , вы можете сделать это, назначив символы по одному :

  name [0] =  'J'; name [1] = 'o'; name [2] = 'h'; name [3] = 'n'; name [4] = 0; /* завершающий нулевой символ. примечание: это уже было сделано инициализацией */ 

Теперь в памяти у вас есть:

  + --- + -  - + --- + --- + --- + имя |  J |  о |  ч |  п |  0 | /* у вас действительно есть значение ASCII для */+ --- + --- + --- + --- + --- +/* каждой буквы, хранящейся в элементах */ 

Конечно, никто не назначает по одному символу таким образом. У вас много вариантов, используя одну из функций, предоставляемых C, например strcpy , strncpy , memcpy , или путем чтения информации из файлового потока или дескриптора файла с помощью fgets , getline или с помощью простого loop и индексной переменной для выполнения присваивания, или используя одну из функций форматирования строк, например sprintf и т. д. Например, вы можете сделать то же самое с любым из следующих действий:

 /* прямая копия */strcpy  (имя, «Джон»); strncpy (имя, «Джон», 5); memcpy (имя, «Джон», sizeof «Джон»); /* включить копию завершающего символа *//* чтение из stdin в имя */printf ("Пожалуйста, введите имя (максимум 4 символа):"); scanf ("% [^  n]% * c", name  );  

Примечание: выше с strncpy , если у вас было НЕ инициализировал все элементы значением 0 (последний из которых будет служить вашим завершающим нулем символом, а затем использовал strncpy (name , "John", 4); вам нужно будет вручную завершить строку с помощью name [4] = 0; , иначе вы бы не иметь допустимой строки (у вас будет незавершенный массив символов, который приведет к неопределенному поведению , если вы использовали name там, где ожидалась строка.)

Если вы явно не понимаете этот STOP , прочтите и поймите, что такое строка с нулевым символом в конце и чем она отличается из массива символов . Серьезно, остановитесь сейчас и идите учиться, это то, что фундаментальный для C. (если он не заканчивается символом , завершающим нуль — это не c-строка.

Что делать, если я этого не сделаю ‘ Не знаете, сколько символов мне нужно сохранить?

Динамическое размещение символьных строк

Когда вы не знаете, сколько символов вам нужно сохранить (или, как правило, сколько данных любого типа), обычный подход заключается в том, чтобы объявить указатель на тип , а затем выделить разумно ожидаемый объем памяти (просто исходя из вашего лучшего понимания того, с чем вы имеете дело), ​​а затем перераспределите, чтобы добавить дополнительную память по мере необходимости . В этом нет никакого волшебства, это просто другой способ сообщить компилятору, как управлять памятью. Просто помните, когда вы выделяете память, она принадлежит вам.. Вы несете ответственность за (1) сохранение указателя на начальный адрес блока памяти (чтобы его можно было освободить позже); и (2) освобождение памяти, когда вы закончите с ней.

Простой пример поможет. Большинство функций выделения/освобождения памяти объявлены в stdlib.h .

  char * name = NULL; /* объявляем указатель и инициализируем его значением NULL */name = malloc (5 * sizeof * name); /* выделяем 5-байтовый блок памяти для имени */if (! name) {/* проверяем выделение памяти - каждый раз */fputs ("error: присвоение имени не выполнено, выход.", stderr);  exit (EXIT_FAILURE);}/* Теперь используйте имя, как если бы вы использовали статически объявленное имя выше */strncpy (name, "John", 5); printf ("name contains:% s  n", name); бесплатно  (имя); /* освобождаем память, когда она больше не нужна.  (при повторном использовании имени установите 'name = NULL;') */ 

Примечание. malloc делает НЕ инициализируйте содержимое выделяемой памяти. Если вы хотите инициализировать новый блок памяти нулем (как мы это сделали со статическим массивом), используйте calloc вместо malloc . Вы также можете использовать malloc , а затем вызвать memset .

Что произойдет, если я выделю память , то нужно больше?

Как упоминалось выше при обсуждении динамической памяти, общая схема состоит в том, чтобы выделить разумный ожидаемый объем, а затем перераспределить по мере необходимости. Вы используете realloc для перераспределения исходного блока памяти, созданного malloc . realloc по существу создает новый блок памяти, копирует память из вашего старого блока в новый, а затем освобождает старый блок памяти. Поскольку старый блок памяти освобожден , вы хотите использовать временный указатель для перераспределения. Если перераспределение не удается, у вас все еще есть доступный исходный блок памяти.

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

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

  #include  #include  #include  int main (int  argc, char ** argv) {if (argc  

Использование/вывод

  $ ./bin/arraybasics "  John Q. Public "выделил 15 байтов памяти для name name: John Q. Public" (начинается с адреса: 0xf17010) перераспределил name на 30 байтов, окончательное имя: "John Q. Public перераспределено"   

Проверка памяти

Когда вы динамически выделяете память, вы должны убедиться, что вы используете память правильно и что вы отслеживаете и освобождаете всю выделенную память. Используйте средство проверки ошибок памяти, например valgrind , чтобы проверить правильность использования памяти. (нет оправдания, это просто сделать) Просто введите valgrind yourprogramexe

  $ valgrind ./bin /arraybasics "John Q. Public" == 19613 == Memcheck, детектор ошибок памяти == 19613 == Copyright (C) 2002-2012, и GNU GPL'd, Джулиан Сьюард и др. == 19613 == Использование  Valgrind-3.8.1 и LibVEX;  перезапустите с -h для информации об авторских правах == 19613 == Команда: ./bin/arraybasics John  Q.  Public == 19613 == выделено 15 байт памяти для 'name' name: 'John Q. Public' (начинается с  адрес: 0x51e0040) перераспределил 'name' на 30 байт, окончательное имя: 'John Q. Public relocated '== 19613 ==== 19613 == СВОДКА КУЧИ: == 19613 == используется на выходе: 0 байт в 0 блоках == 19613 == общее использование кучи: 2 аллока, 2 освобождения, выделено 45 байтов =  = 19613 ==== 19613 == Все блоки кучи были освобождены - утечки невозможны == 19613 ==== 19613 == Для подсчета обнаруженных и подавленных ошибок перезапустите с: -v == 19613 == СВОДКА ОБ ОШИБКАХ  : 0 ошибок из 0 контекстов (подавлено: 2 из 2)  

В выводе следующие строки имеют особое значение:

  == 19613 == СВОДКА КУЧИ: == 19613 == используется на выходе: 0 байт в 0 блоках == 19613 == общее использование кучи: 2 аллока, 2 освобождения, выделено 45 байтов  

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

Не менее важна СВОДКА ОБ ОШИБКАХ :

  == 19613 == СВОДКА ОБ ОШИБКАХ: 0 ошибок из 0 контекстов (подавлено: 2 из 2)  

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

(подавлено : 2 из 2 относятся только к дополнительным библиотекам отладки, которых нет в моей системе)

Это закончилось дольше, чем предполагалось, но если это поможет, оно того стоило. Удачи.

Улучшите этот ответ
отредактировал 23 янв. ’20 в 1:37
ответил 7 сен 2015 в 18:01
добавить комментарий |

Объявление массивов статических символов (строк)

Когда вы знаете (или имеете разумное представление о том, насколько большим должен быть ваш массив, вы можете просто объявить массив достаточного размера для обработки вашего ввода (т.е. если ваши имена не длиннее 25 символов, тогда вы можете безопасно объявить name [26] . Для строк вам всегда нужно как минимум количество символов для хранения + 1 (для завершающего нуля символа).

Если может быть несколько символов больше 25, нет ничего плохого в объявлении вашего массива на несколько байтов длиннее, чем необходимо для защиты от случайной записи за пределы массива. Скажите name [32] .

Давайте объявим массив из 5 символов ниже и посмотрите, как информация хранится в памяти..

  имя символа [5] = {0}; /* всегда инициализируйте ваши массивы */ 

Приведенное выше объявление создает массив из 5-подрядных байтов в стеке для вашего использования. например, вы можете визуализировать 5-байтовую память, инициализированную нулем, следующим образом:

  + --- + --- + --- + --- + -  - + имя |  0 |  0 |  0 |  0 |  0 |  + --- + --- + --- + --- + --- +  'name' содержит начальный адрес блока памяти, который является массивом (то есть адрес первого элемента, например: 0x7fff050bf3d0)   

Примечание: при использовании name для хранения «символьной строки» фактическая строка может быть не длиннее, чем 4 , потому что вы должны заканчивать строку с помощью завершающего нуля символа , который является нулевым символом ' 0' (или просто числовой 0 , оба эквивалентны)

Для хранения информации в name , вы можете сделать это, назначив символы по одному :

  name [0] =  'J'; name [1] = 'o'; name [2] = 'h'; name [3] = 'n'; name [4] = 0; /* завершающий нулевой символ.  примечание: это уже было сделано инициализацией */ 

Теперь в памяти у вас есть:

  + --- + -  - + --- + --- + --- + имя |  J |  о |  ч |  п |  0 | /* у вас действительно есть значение ASCII для */+ --- + --- + --- + --- + --- +/* каждой буквы, хранящейся в элементах */ 

Конечно, никто не назначает по одному символу таким образом. У вас много вариантов, используя одну из функций, предоставляемых C, например strcpy , strncpy , memcpy , или путем чтения информации из файлового потока или дескриптора файла с помощью fgets , getline или с помощью простого loop и индексной переменной для выполнения присваивания, или используя одну из функций форматирования строк, например sprintf и т. д. Например, вы можете сделать то же самое с любым из следующих действий:

 /* прямая копия */strcpy  (имя, «Джон»); strncpy (имя, «Джон», 5); memcpy (имя, «Джон», sizeof «Джон»); /* включить копию завершающего символа *//* чтение из stdin в имя */printf ("Пожалуйста, введите имя (максимум 4 символа):"); scanf ("% [^  n]% * c", name  );  

Примечание: выше с strncpy , если у вас было НЕ инициализировал все элементы значением 0 (последний из которых будет служить вашим завершающим нулем символом, а затем использовал strncpy (name , "John", 4); вам нужно будет вручную завершить строку с помощью name [4] = 0; , иначе вы бы не иметь допустимой строки (у вас будет незавершенный массив символов, который приведет к неопределенному поведению , если вы использовали name там, где ожидалась строка. )

Если вы явно не понимаете этот STOP , прочтите и поймите, что такое строка с нулевым символом в конце и как он отличается от массива символов . Серьезно, остановитесь сейчас и начните учиться, это фундамент для C. (если он не заканчивается символом завершающий нуль — это не c-строка.

Что делать, если я не знаю, сколько символов мне нужно сохранить?

Динамическое размещение символьных строк

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

Простой пример поможет. Большинство функций выделения/освобождения памяти объявлены в stdlib.h .

  char * name = NULL; /* объявляем указатель и инициализируем его значением NULL */name = malloc (5 * sizeof * name); /* выделяем 5-байтовый блок памяти для имени */if (! name) {/* проверяем выделение памяти - каждый раз */fputs ("error: присвоение имени не выполнено, выход.", stderr);  exit (EXIT_FAILURE);}/* Теперь используйте имя, как если бы вы использовали статически объявленное имя выше */strncpy (name, "John", 5); printf ("name contains:% s  n", name); бесплатно  (имя); /* освобождаем память, когда она больше не нужна.  (при повторном использовании имени установите 'name = NULL;') */ 

Примечание. malloc делает НЕ инициализируйте содержимое выделяемой памяти. Если вы хотите инициализировать новый блок памяти нулем (как мы это сделали со статическим массивом), используйте calloc вместо malloc . Вы также можете использовать malloc , а затем вызвать memset .

Что произойдет, если я выделю память , то нужно больше?

Как упоминалось выше при обсуждении динамической памяти, общая схема состоит в том, чтобы выделить разумный ожидаемый объем, а затем перераспределить по мере необходимости. Вы используете realloc для перераспределения исходного блока памяти, созданного malloc . realloc по существу создает новый блок памяти, копирует память из вашего старого блока в новый, а затем освобождает старый блок памяти. Поскольку старый блок памяти освобожден , вы хотите использовать временный указатель для перераспределения. Если перераспределение не удается, у вас все еще есть доступный исходный блок памяти.

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

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

  #include  #include  #include  int main (int  argc, char ** argv) {if (argc  

Использование/вывод

  $ ./bin/arraybasics "  John Q. Public "выделил 15 байтов памяти для name name: John Q. Public" (начинается с адреса: 0xf17010) перераспределил name на 30 байтов, окончательное имя: "John Q. Public перераспределено"   

Проверка памяти

Когда вы динамически выделяете память, вы должны убедиться, что вы используете память правильно и что вы отслеживаете и освобождаете всю выделенную память. Используйте средство проверки ошибок памяти, например valgrind , чтобы убедиться, что ваша память используется правильно.. (нет оправдания, это просто сделать) Просто введите valgrind yourprogramexe

  $ valgrind ./bin /arraybasics "John Q. Public" == 19613 == Memcheck, детектор ошибок памяти == 19613 == Copyright (C) 2002-2012, и GNU GPL'd, Джулиан Сьюард и др. == 19613 == Использование  Valgrind-3.8.1 и LibVEX;  перезапустите с -h для информации об авторских правах == 19613 == Команда: ./bin/arraybasics John  Q.  Public == 19613 == выделено 15 байт памяти для 'name' name: 'John Q. Public' (начинается с  адрес: 0x51e0040) перераспределено 'name' на 30 байт. Окончательное имя: 'John Q. Public relocated' == 19613 ==== 19613 == СВОДКА КУЧИ: == 19613 == используется на выходе: 0 байтов в 0 блоках =  = 19613 == общее использование кучи: 2 аллока, 2 освобождения, выделено 45 байтов == 19613 ==== 19613 == Все блоки кучи были освобождены - утечки невозможны == 19613 ==== 19613 == Для счетчиков  обнаруженных и подавленных ошибок, перезапустите с: -v == 19613 == СВОДКА ОБ ОШИБКАХ: 0 ошибок из 0 контекстов (подавлено: 2 из 2)  

В выходных данных следующее строки имеют особое значение:

  == 19613 == ОБЗОР КУЧИ: == 19613 == используется на выходе: 0 байт в 0 блоках == 19613 == общая куча  использование: 2 выделения, 2 освобождения, выделено 45 байтов  

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

Не менее важна СВОДКА ОБ ОШИБКАХ :

  == 19613 == СВОДКА ОБ ОШИБКАХ: 0 ошибок из 0 контекстов (подавлено: 2 из 2)  

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

(подавлено : 2 из 2 относятся только к дополнительным библиотекам отладки, которых нет в моей системе)

Это закончилось дольше, чем предполагалось, но если это поможет, оно того стоило. Удачи.


5

Как я могу объявить массив, а затем определить его размер?

Не надо; «объявите» его, когда вы знаете, какого он должен быть размера. В любом случае вы не можете использовать его раньше.

В C99 и более поздних версиях вы можете определять переменные при необходимости — в любом месте блока операторов. Вы также можете использовать VLA (массивы переменной длины), размер которых неизвестен до времени выполнения. Не создавайте огромные массивы в виде VLA (например, 1 МиБ или более — но настройте лимит в соответствии с вашей машиной и предрассудками); в конце концов, используйте динамическое выделение памяти.

Если вы застряли с архаичным стандартом C89/C90, тогда вы можете определять переменные только в начале блока, а размеры массивов известны во время компиляции , поэтому вам нужно использовать динамическое выделение памяти — malloc () , free () и т. д..

Улучшите этот ответ
отредактировано 7 сен 2015, 16:21
ответил 7 сен 2015 в 16:13
добавить комментарий |

Как я могу объявить массив, а затем определить его размер?

Не надо; «объявите» его, когда вы знаете, какого он должен быть размера. В любом случае вы не можете использовать его раньше.

В C99 и более поздних версиях вы можете определять переменные при необходимости — в любом месте блока операторов. Вы также можете использовать VLA (массивы переменной длины), размер которых неизвестен до времени выполнения. Не создавайте огромные массивы в виде VLA (например, 1 МиБ или более — но настройте лимит в соответствии с вашей машиной и предрассудками); все-таки использовать динамическое выделение памяти.

Если вы застряли с архаичным стандартом C89/C90, тогда вы можете определять переменные только в начале блока, а размеры массивов известны во время компиляции , поэтому вам нужно использовать динамическое выделение памяти — malloc () , free () и т. д.


1

Сначала объявите указатель на «char». Затем попросите (систему) выделить место для хранения необходимое количество значений, используя malloc, а затем добавьте элементы в этот «массив».

  char * test; int num_of_elements = 99; test = malloc (sizeof (char) * num_of_elements  ); //тестовые точки на первый массив elamenttest [0] = 11; test [1] = 22;//и т. д.  

Улучшите этот ответ
ответил 7 сен 2015 в 16:18
  • делаем это так можно было бы просто char test [99]; с точно таким же результатом. — Gewure 08 мар. ’17 в 8:29
добавить комментарий |

Сначала объявите указатель на «char». Затем попросите (систему) выделить место для хранения необходимого количества значений, используя malloc и затем добавьте элементы в этот «массив».

  char * test; int num_of_elements = 99; test = malloc (sizeof (char) * num_of_elements); //тестовые точки на первый массив elamenttest [0] = 11; test [1] = 22;//и т. д.  

1

Есть два способа решения этой проблемы.

Метод №1: Используйте максимальный размер для определения вашего массив. Вот как выглядит код:

  char test [max_size];  

Затем вам нужно отслеживать, сколько элементов фактически израсходованы. Это обычно используется в некотором сетевом коде старой школы.

Метод № 2: Используйте динамическую память. Обратите внимание, что здесь есть небольшая проблема с производительностью (потенциально), так как вы каждый раз запрашиваете у ОС кусок памяти. Здесь уже есть ответ, который показывает, как это сделать. Просто не забудьте вызвать free (), как только вы закончите использовать свой массив.

Улучшите этот ответ
ответил 7 сен 2015 в 16:22
добавить комментарий |

Есть два способа решения этой проблемы.

Метод №1: Используйте максимальный размер для определения ваш массив. Вот как выглядит код:

  char test [max_size];  

Затем вам нужно отслеживать, сколько элементов фактически израсходованы. Это обычно используется в некотором сетевом коде старой школы.

Метод № 2: Используйте динамическую память. Обратите внимание, что здесь есть небольшая проблема с производительностью (потенциально), так как вы каждый раз запрашиваете у ОС кусок памяти. Здесь уже есть ответ, который показывает, как это сделать. Просто не забудьте вызвать free (), как только вы закончите использовать свой массив.


0

В зависимости от вашей (i) цепочки инструментов и (ii) как и когда вы узнаете размер — у вас есть возможность использовать либо (а) массивы переменной длины, либо (б) динамический Функции распределения памяти.

if (цепочка инструментов поддерживает C99 и более поздние версии) или (вы будете знать длину массива во время выполнения) используйте массив переменной длины

if (более старая цепочка инструментов) или (вам нужна гибкость выделения и освобождения памяти) используйте функцию распределения динамической памяти

вот примеры

  void f (int m,  char C [m] [m]) {char test [m];  :}  

или

  void somefunc (int n) {char * test;  test = malloc (n * sizeof (char)); //проверяем на наличие test! = null//используем test free (test);}  

можно записать с использованием VLA как

  int n = 5; char test [n];  

Улучшите этот ответ
ответил 7 сен 2015 в 16:49
добавить комментарий |

В зависимости от вашей (i) цепочки инструментов и (ii) как и когда вы узнаете размер — у вас есть возможность используйте либо (а) массивы переменной длины, либо (б) функции динамического распределения памяти.

, если (цепочка инструментов поддерживает C99 и более поздние версии) или (вы будете знать длину массива во время выполнения) используйте переменную длину Массив

if (более старая цепочка инструментов) или (вы хотите гибкость выделения и освобождения памяти) используйте функцию распределения динамической памяти

вот примеры

  void f (int m, char C [m] [m]) {char test [m];  :}  

или

  void somefunc (int n) {char * test;  test = malloc (n * sizeof (char)); //проверяем наличие test! = null//используем test free (test);}  

можно записать с использованием VLA как

  int n = 5; char test [n];  


Расширение файла

Методы хранения и сжатия данных

Ховард Аустерлиц, в Методы сбора данных с использованием ПК (второе издание), 2003 г.

9.2.2 .TXT и другие файлы ASCII

Многие расширения файлов обычно связаны с файлами ASCII, хотя они задаются прикладными программами, а не самой DOS. Например, .TXT и .DOC являются распространенными типами файлов ASCII в DOS. В Windows файлы с определенными расширениями явно связаны с конкретными приложениями: например, файлы .TXT обычно связаны с текстовым редактором NOTEPAD. Даже когда данные ASCII используются приложением, это не всегда «обычная ваниль» (в точности следуя 7-битному коду ASCII). Некоторые прикладные программы для обработки текстов смешивают ASCII с двоичными данными в своих файлах. Другие используют восьмой бит каждого символа для специальных команд форматирования текста (таких как подчеркивание), которые ASCII не поддерживает напрямую.

Команда DOS TYPE отображает файл ASCII на видеодисплее.. Если отображаемый текст выглядит искаженным или содержит символы, отличные от буквенно-цифровых (например, улыбающиеся лица), файл не состоит из простых 7-битных символов ASCII.

Программные файлы IBM BASIC и GW BASIC с расширением. Расширение BAS. Эти файлы обычно были модифицированы ASCII с использованием специальных символов, называемых токенами, для представления общих команд BASIC. BASIC мог бы сохранять свои программные файлы в виде простого ASCII, если бы это было специально указано. BASIC также создавал файлы данных ASCII, которые могли использоваться различными прикладными программами.

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

Просмотреть главу Приобрести книгу
Читать главу полностью
URL: https://www.sciencedirect.com/science/article/pii/B9780120683772500097
Оцените статью
logicle.ru
Добавить комментарий