Как записать массив в файл c

Обновлено: 29.06.2024

Строка — это одномерный массив символов, поэтому массив строк — это двумерный массив символов. Так же, как мы можем создать двумерный массив int, float и т. д.; мы также можем создать двумерный массив символов или массив строк. Вот как мы можем объявить двухмерный массив символов.

Важно заканчивать каждый одномерный массив нулевым символом, иначе это будет просто массив символов. Мы не можем использовать их как строки.

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

Первый нижний индекс массива, т. е. 3, обозначает количество строк в массиве, а второй нижний индекс обозначает максимальную длину строки. Напомним, что в C каждый символ занимает 1 байт данных, поэтому, когда компилятор видит указанный выше оператор, он выделяет 30 байт (3*10) памяти.

Мы уже знаем, что имя массива является указателем на 0-й элемент массива. Можете ли вы угадать тип ch_arr ?

ch_arr — это указатель на массив из 10 символов или int(*)[10] .

Поэтому, если ch_arr указывает на адрес 1000, то ch_arr + 1 будет указывать на адрес 1010 .

Из этого мы можем сделать вывод, что:

ch_arr + 0 указывает на 0-ю строку или 0-й одномерный массив.
ch_arr + 1 указывает на 1-ю строку или 1-й одномерный массив.
ch_arr + 2 указывает на вторую строку или второй одномерный массив.

Как правило, ch_arr + i указывает на i-ю строку или i-й одномерный массив.


Мы знаем, что при разыменовании указателя на массив мы получаем базовый адрес массива. Итак, при разыменовании ch_arr + i мы получаем базовый адрес 0-го одномерного массива.

Из этого мы можем сделать вывод, что:

*(ch_arr + 0) + 0 указывает на 0-й символ 0-го одномерного массива (т.е. s )
*(ch_arr + 0) + 1 указывает на 1-й символ 0-го одномерного массива ( т.е. p )
*(ch_arr + 1) + 2 указывает на 2-й символ 1-го одномерного массива (т.е. m )

В целом можно сказать, что: *(ch_arr + i) + j указывает на j-й символ i-го одномерного массива.

Обратите внимание, что базовый тип *(ch_arr + i) + j — это указатель на char или (char*) , а базовый тип ch_arr + i — массив из 10 символов или int(*)[10] .

Чтобы получить элемент в j-й позиции i-го одномерного массива, просто разыменуйте все выражение *(ch_arr + i) + j .

В главе «Указатели и двумерные массивы» мы узнали, что в двумерном массиве запись указателя эквивалентна записи нижнего индекса. Таким образом, приведенное выше выражение можно записать следующим образом:

Есть простой C-код, в котором я определил массив строкового типа. Нужно сохранить его в ASCII-файл (впоследствии мне нужно будет прочитать массив обратно из этого файла). Я знаю, что сделал что-то не так в 'fwrite'. Пожалуйста, помогите мне найти проблему и исправить ее.

a — это массив из двух указателей, и вы записываете 13 байтов, начиная с первого указателя. Если указатели имеют размер 8 байт каждый, вы записываете первые 13 байтов значений указателя. Если это 4-байтовые указатели, то вы записываете все 8 байтов двух указателей плюс 5 байтов того, что находится непосредственно после них в памяти. Вы вообще не записываете строки (если только у вас нет 4-байтовых указателей и часть строк находится в этих 5 дополнительных байтах).

Обычно вы не используете fwrite для записи в текстовый файл. fprintf более обычный.

Первоначальное сообщение от john.c

a — это массив из двух указателей, и вы записываете 13 байтов, начиная с первого указателя. Если указатели имеют размер 8 байт каждый, вы записываете первые 13 байтов значений указателя. Если это 4-байтовые указатели, то вы записываете все 8 байтов двух указателей плюс 5 байтов того, что находится непосредственно после них в памяти. Вы вообще не записываете строки (если только у вас нет 4-байтовых указателей и часть строк находится в этих 5 дополнительных байтах).

Обычно вы не используете fwrite для записи в текстовый файл. fprintf более обычный.

Я нашел в Интернете следующий пример:

Больше всего мне интересна следующая строка:

Первоначально опубликовано Бьерном Страуструпом (2000-10-14)

Каждый день я получаю около двух десятков запросов о помощи в решении какой-либо проблемы с программированием или дизайном. У большинства больше здравого смысла, чем прислать мне сотни строк кода. Если да, я прошу их найти наименьший пример, демонстрирующий проблему, и прислать мне его. В большинстве случаев они сами находят ошибку. «Поиск наименьшей программы, демонстрирующей ошибку» — мощный инструмент отладки.

Первоначальное сообщение от john.c

a — это массив из двух указателей, и вы записываете 13 байтов, начиная с первого указателя. Если указатели имеют размер 8 байт каждый, вы записываете первые 13 байтов значений указателя.Если это 4-байтовые указатели, то вы записываете все 8 байтов двух указателей плюс 5 байтов того, что находится непосредственно после них в памяти. Вы вообще не записываете строки (если только у вас нет 4-байтовых указателей и часть строк находится в этих 5 дополнительных байтах).

Обычно вы не используете fwrite для записи в текстовый файл. fprintf более обычный.

Кто-то помог мне с этим кодом, теперь работает сохранение массива в файл. Я добавил вторую часть - чтение массива из файла - компилятор пожаловался, что что-то не так. Может быть, вы знаете, где ошибка?

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

Я объявил то, на что указывают указатели, как const, потому что они будут указывать на строковые константы, затем я объявил сами указатели как const, потому что вы никогда не изменяете это, и, похоже, в этом нет необходимости. Если у вас есть больше контекста относительно того, о чем эти выходные данные, было бы лучше использовать это в названии вместо более общего имени «выходные данные».

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

Внеся эти изменения, мы можем перейти к вашей прочитанной части. Вы должны знать, что это создает массив переменной длины:

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

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

Для удобства я предлагаю вам предположить, что существует известная верхняя граница длины входных строк, а затем настроить массивы char так, чтобы она соответствовала этой верхней границе. Например, вы можете использовать BUFSIZ из:

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

Первоначально опубликовано Бьерном Страуструпом (2000-10-14)

Каждый день я получаю около двух десятков запросов о помощи в решении какой-либо проблемы с программированием или дизайном. У большинства больше здравого смысла, чем прислать мне сотни строк кода. Если да, я прошу их найти наименьший пример, демонстрирующий проблему, и прислать мне его. В большинстве случаев они сами находят ошибку. «Поиск наименьшей программы, демонстрирующей ошибку» — мощный инструмент отладки.

Массив – это набор элементов одного типа, размещенных в смежных областях памяти, на которые можно ссылаться по отдельности, используя индекс для уникального идентификатора.

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

Например, целочисленный массив из пяти элементов foo может быть логически представлен как;

где каждая пустая панель представляет собой элемент массива. В данном случае это значения типа int. Эти элементы пронумерованы от 0 до 4, где 0 — первый, а 4 — последний; В C++ индекс первого элемента массива всегда равен нулю. Как и ожидалось, массив n должен быть объявлен до его использования. Типичное объявление массива в C++:

где type — допустимый тип (например, int, float . ), name — допустимый идентификатор, а поле elements (которое всегда заключено в квадратные скобки [] ) указывает размер массива.

Таким образом, массив foo с пятью элементами типа int может быть объявлен как:

Поле элементов в квадратных скобках [], представляющее количество элементов в массиве, должно быть постоянным выражением, поскольку массивы представляют собой блоки статической памяти, размер которых должен быть известен во время компиляции.

Инициализация массивов

По умолчанию не инициализированы. Это означает, что ни один из его элементов не имеет определенного значения; их содержимое не определено в момент объявления массива.

Инициализатор может даже не иметь значений, только фигурные скобки:

Это создает массив из пяти значений типа int, каждое из которых инициализируется нулевым значением:

Но элементы массива можно явно инициализировать определенными значениями при его объявлении, заключив эти начальные значения в фигурные скобки <>.Например:

Этот оператор объявляет массив, который может быть представлен следующим образом:

Количество значений между фигурными скобками <> не должно превышать количество элементов в массиве. Например, в приведенном выше примере было объявлено, что foo имеет 5 элементов (как указано числом, заключенным в квадратные скобки, []), а фигурные скобки <> содержат ровно 5 значений, по одному для каждого элемента. Если объявлено с меньшим значением, для остальных элементов устанавливаются значения по умолчанию (что для фундаментальных типов означает, что они заполнены нулями). Например:

Создаст такой массив:

Когда для массива предусмотрена инициализация значений, C++ допускает возможность оставлять квадратные скобки пустыми[]. В этом случае компилятор автоматически примет размер массива, соответствующий количеству значений, заключенных между фигурными скобками <>:

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

Наконец, эволюция C++ привела к принятию универсальной инициализации также и для массивов. Поэтому больше нет необходимости в знаке равенства между объявлением и инициализатором. Оба эти утверждения эквивалентны:

Статические массивы и массивы, объявленные непосредственно в пространстве имен (вне какой-либо функции), всегда инициализируются. Если явный инициализатор не указан, все элементы инициализируются по умолчанию (с нулями для основных типов).

Доступ к массиву

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

Следуя предыдущим примерам, в которых foo имеет 5 элементов, и каждый из этих элементов имеет тип int, имя, которое можно использовать для ссылки на каждый элемент, будет следующим:

Например, следующий оператор сохраняет значение 75 в третьем элементе foo :

и, например, следующий код копирует значение четвертого элемента foo в переменную с именем x:

Поэтому выражение foo[2] или foo[4] всегда оценивается как целое число. Обратите внимание, что третий элемент foo указан как foo[2] , второй — foo[1] , поскольку первый — foo[0] . Таким образом, его последний элемент — foo[4] . Если мы напишем foo[5] , мы получим доступ к шестому элементу foo и, следовательно, фактически превысим размер массива.

В C++ синтаксически правильно превышать допустимый диапазон индексов для массива. Это может создать проблемы, поскольку доступ к элементам вне допустимого диапазона не вызывает ошибок при компиляции, но может вызвать ошибки во время выполнения. Это разрешено потому, что проверка индекса замедляет выполнение программы. На этом этапе важно уметь четко различать два варианта использования квадратных скобок [] в отношении массивов. Они выполняют две разные задачи: первая — указывать размер массивов при их объявлении; а второй - указать индексы для конкретных элементов массива при доступе к ним. Не путайте эти два варианта использования квадратных скобок [] с массивами.

Основное отличие состоит в том, что перед объявлением указывается тип элементов, а перед доступом — нет.

Некоторые другие допустимые операции с массивами:

Например:
Многомерные массивы

Многомерные массивы можно описать как "массивы массивов". Например, двумерный массив можно представить как двумерную таблицу, состоящую из элементов, все они содержат элементы одного типа.

Таблица представляет собой двумерный массив из 3 на 5 элементов типа int. Синтаксис C++ для этого:

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

(помните, что индексы массива всегда начинаются с нуля).

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

Объявляет массив с элементом типа char для каждой секунды века. Это составляет более 3 миллиардов символов! Таким образом, это объявление потребовало бы более 3 гигабайт памяти! И такое заявление маловероятно и подчеркивает неэффективное использование памяти.

В конце концов, многомерные массивы — это просто абстракция для программистов, поскольку тех же результатов можно добиться с простым массивом, перемножая его индексы:

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

Многомерный массив
Псевдомногомерный массив

Ни один из двух вышеприведенных фрагментов кода не выводит вывод на экран, но оба присваивают значения блоку памяти с именем jimmy следующим образом:

Обратите внимание, что в коде для ширины и высоты используются именованные константы, а не их числовые значения. Это делает код более читабельным и позволяет легко вносить изменения в код в одном месте.

Использование цикла для ввода двумерного массива от пользователя
Массивы как параметры

Двумерные массивы можно передавать в качестве параметров функции, и они передаются по ссылке. Это означает, что функция может напрямую обращаться к содержимому переданного массива и изменять его. При объявлении двумерного массива в качестве формального параметра мы можем опустить размер первого измерения, но не второго; то есть мы должны указать количество столбцов. Например:

void print(int A[][3],int N, int M)

Чтобы передать этой функции массив, объявленный как:

нам нужно написать такой вызов:

Вот полный пример:

Инженеры используют двумерные массивы для представления матриц. Ниже показан код функции, которая находит сумму двух матриц A и B.

Функция нахождения суммы двух матриц
Функция для определения транспонирования матрицы A
Массивы как параметры

В какой-то момент нам может понадобиться передать массив функции в качестве параметра. В C++ невозможно передать весь блок памяти, представленный массивом, в функцию напрямую в качестве аргумента. Но вместо этого можно передать его адрес. На практике это дает почти такой же эффект, но это гораздо более быстрая и эффективная операция.

Чтобы принять массив в качестве параметра функции, параметры можно объявить как тип массива, но с пустыми скобками, опуская фактический размер массива. Например:

Эта функция принимает параметр типа "массив целых чисел" с именем arg . Чтобы передать этой функции массив, объявленный как:

достаточно написать такой вызов:

Вот вам полный пример:

Решение

В приведенном выше коде первый параметр ( int arg[] ) принимает любой массив, элементы которого имеют тип int, независимо от его длины. По этой причине мы включили второй параметр, который сообщает функции длину каждого массива, который мы передаем ей в качестве первого параметра.

В объявление функции также можно включать многомерные массивы. Формат параметра трехмерного массива:

Например, функция с многомерным массивом в качестве аргумента может быть:

Обратите внимание, что первые квадратные скобки [] оставлены пустыми, а следующие указывают размеры для соответствующих размеров. Это необходимо для того, чтобы компилятор мог определить глубину каждого дополнительного измерения.

В некотором смысле передача массива в качестве аргумента всегда приводит к потере измерения. Причина в том, что по историческим причинам массивы не могут быть скопированы напрямую, и поэтому на самом деле передается указатель. Это распространенный источник ошибок для начинающих программистов. Хотя четкое понимание указателей, объясненное в следующей главе, очень помогает.

(PHP 4, PHP 5, PHP 7, PHP 8)

file — считывает весь файл в массив

Описание

Считывает весь файл в массив.

Примечание.

Вы можете использовать file_get_contents() для возврата содержимого файла в виде строки.

Параметры

Путь к файлу.

URL-адрес можно использовать в качестве имени файла с этой функцией, если включена оболочка fopen. См. fopen() для более подробной информации о том, как указать имя файла. См. Поддерживаемые протоколы и оболочки для получения ссылок на информацию о возможностях различных оболочек, заметок об их использовании и информации о любых предопределенных переменных, которые они могут предоставлять.

Необязательные флаги параметров могут быть одной или несколькими из следующих констант: FILE_USE_INCLUDE_PATH Поиск файла в include_path. FILE_IGNORE_NEW_LINES Пропускать новую строку в конце каждого элемента массива FILE_SKIP_EMPTY_LINES Пропускать пустые строки

Возвращаемые значения

Возвращает файл в виде массива. Каждый элемент массива соответствует строке в файле с прикрепленным символом новой строки. При ошибке file() возвращает false .

Примечание.

Каждая строка результирующего массива будет включать окончание строки, если только не используется FILE_IGNORE_NEW_LINES.

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

Ошибки/Исключения

Выдает ошибку уровня E_WARNING, если файл не существует.

Примеры

// Используя необязательный параметр flags
$trimmed = file ( 'somefile.txt», FILE_IGNORE_NEW_LINES | FILE_SKIP_EMPTY_LINES);
?>

Примечания

См. также

  • file_get_contents() — считывает весь файл в строку
  • readfile() — выводит файл
  • fopen() — открывает файл или URL-адрес
  • fsockopen() – открыть подключение к Интернету или доменному сокету Unix.
  • popen() — открывает указатель файла процесса
  • включить – включить
  • stream_context_create() — создает контекст потока.

Примечания, внесенные пользователями 15 примечаний

Если файл, который вы читаете, имеет формат CSV, не используйте file(), используйте fgetcsv(). file() будет разделять файл по каждой новой строке, которую он найдет, даже новой строке, которая появляется в поле (т.е. в кавычках).

это может быть очевидным, но мне потребовалось некоторое время, чтобы понять, что я делаю неправильно. Поэтому я хотел поделиться. У меня есть файл на моем диске "c:\". Как мне файл() это?

Не забывайте, что обратная косая черта является специальной, и вы должны «экранировать» обратную косую черту, т. е. «\\»:

$lines = файл ("C:\\Documents and Settings\\myfile.txt");

foreach($lines as $line)
echo( $line);
>

надеюсь, это поможет.

Чтобы записать все строки файла, другими словами, прочитать файл построчно, вы можете написать следующий код:
$names = file ( 'name.txt' );
// Чтобы проверить количество строк
echo count ( $names ). '
' ;
foreach( $names as $name )
echo $name . '
' ;
>
?>

этот пример настолько прост, что можно понять, как он работает. Надеюсь, это поможет многим новичкам.

читать из CSV-данных (файла) в массив с именованными ключами

<р>. с или без 1-й строки = заголовок (ключи)
(см. 4-й параметр вызова функции как true/false)

функция csv_in_array ($url, $delm = ";", $encl = "\"", $head = false)

$csvxrow = файл ( $url ); // ---- строки csv в массив ----

$csvxrow [ 0 ] = отбивная ( $ csvxrow [ 0 ]);
$csvxrow [0] = str_replace ($encl, '', $csvxrow [0]);
$keydata = взорвать ( $delm , $csvxrow [ 0 ]);
$keynumb = количество ($keydata);

if ($head === true) <
$anzdata = count ($csvxrow);
$z = 0 ;
for( $x = 1 ; $x < $anzdata ; $x ++) <
$csvxrow [ $x ] = Chop ( $csvxrow [ $x ]);
$csvxrow [$x] = str_replace ($encl, '', $csvxrow [$x]);
$csv_data [$x] = взорвать ($delm, $csvxrow [$x]);
$i = 0 ;
foreach( $keydata as $key ) <
$out [ $z ][ $key ] = $csv_data [ $x ][ $i ];
$i++;
>
$z++;
>
>
else <
$i = 0 ;
foreach( $csvxrow as $item ) <
$item = отбивная ( $item );
$item = str_replace ($encl, '', $item);
$csv_data = взорвать ($delm, $item);
for ( $y = 0 ; $y < $keynumb ; $y ++) <
$out [ $i ][ $y ] = $csv_data [ $y ];
>
$i++;
>
>

?>

вызов функции с 4 параметрами:

(1) = файл с данными CSV (url / строка)
(2) = разделитель столбцов (например: ; или | или , . )
(3) = значения, заключенные в (например, : ' или " или ^ или . )
(4) = с 1-й строкой или без нее = голова (истина/ложь)

Имейте в виду, что использование file() для подсчета строк может привести к OOM на сервере, поскольку все строки будут размещены в массиве.

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

Начиная с PHP 5.6 функции file(), file_get_contents() и fopen() будут возвращать false, если вы ссылаетесь на исходный URL-адрес, не имеющий действительного сертификата SSL. Предположительно, вы будете часто сталкиваться с этим в своих средах разработки, это сведет вас с ума.

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

$args = array("ssl"=>array("verify_peer"=>false,"verify_peer_name"=>false),"http"=>array('timeout' => 60, 'user_agent' => ' Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.8.1.9) Gecko/20071025 Firefox/3.0.0.1'));

(«Проблема file() с UTF-16» неверна. Это обновлено.
Первый может пропустить последнюю строку строки.)

file(), похоже, имеет проблемы с обработкой
UTF-16 с BOM или без него.

file() скорее всего будет считать "\n"=LF (0A) окончанием строки.
Таким образом, не только "000A", но и "010A, 020A. FE0A, FF0A."
рассматриваются как окончание строки.

Более того, file() вызывает серьезную проблему в UTF-16LE.
file() теряет первый "0A" (первую половину "0A00")!
А следующая строка начинается с " 00" (остальная часть "0A00").
Поэтому строки после первого "0A" совершенно разные.

Чтобы избежать этого явления,
например. в случае (php_script: UTF-8, файл: UTF-16 с окончанием строки "\r\n"),

mb_regex_encoding ('UTF-16'); // в помощь mb_ereg_..() работает правильно
$str = file_get_contents ( $file_path );
$to_encoding = 'UTF-16' ; // кодировка строки
$from_encoding = 'UTF-8' ; // кодировка PHP_script
$pattern1 = mb_convert_encoding ('[^\r]*\r\n', $to_encoding, $from_encoding);
mb_ereg_search_init ( $str , $pattern1 );
в то время как ( $res = mb_ereg_search_regs ()) $file [] = $res [ 0 ];
>
$pattern2 = mb_convert_encoding ('\A.*\r\n(.*)\z', $to_encoding, $from_encoding);
mb_ereg ($pattern2, $str, $match);
$file[] = $match[1];

?>

вместо
$file = file($file_path);

Если конец строки равен "\n",
$pattern1 = mb_convert_encoding('[^\n]*\n', $to_encoding, $from_encoding);

Использования if ( file(name.txt) ) может быть недостаточно для проверки того, был ли файл успешно открыт для чтения, потому что файл может быть пустым, и в этом случае возвращаемый массив будет пустым, поэтому вместо этого проверьте с помощью !==. например:

$file_array = файл('test.txt'); // пустой файл

Вот мой конвертер CSV
поддерживает заголовки и обрезает все поля
Примечание: заголовки не должны быть пустыми!

функция csv2array ($file, $delim = ';', $encl = '"', $header = false)

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

Использование rtrim с заменой символов по умолчанию является плохим решением, поскольку оно удаляет все пробелы в дополнение к символам '\r' и '\n'.

Хорошее решение с использованием rtrim:

$line = rtrim ( $line , "\r\n" ) . PHP_EOL;
?>

Это удаляет только символы EOL и заменяет их символом EOL сервера, что позволяет preg_* нормально работать при сопоставлении EOL ($)

Примечание. Теперь, когда file() является двоично-безопасным, он "намного" медленнее, чем раньше. Если вы планируете читать большие файлы, возможно, стоит использовать fgets() вместо file(). Например:

$fd = fopen("log_file.txt", "r");
while (! feof ( $fd ))
<
$buffer = fgets ( $fd , 4096 );
$lines [] = $buffer ;
>
fclose ( $fd );
?>

Результирующий массив $lines.

Я проверил файл из 200 000 строк. Для fgets() это заняло секунды, а для file() — минуты.

Это примечание относится к PHP 5.1.6 под Windows (хотя может относиться и к другим версиям).

Похоже, что флаг FILE_IGNORE_NEW_LINES не удаляет новые строки должным образом при чтении текстовых файлов в стиле Windows, т. е. файлов, строки которых заканчиваются на '\r\n'.

Решение. Всегда используйте rtrim() вместо FILE_IGNORE_NEW_LINES.

Использование file() для чтения больших текстовых файлов размером > 10 МБ создает проблемы, поэтому вам следует использовать его вместо этого. Это намного медленнее, но работает нормально. $lines вернет массив со всеми строками.

$handle = @fopen('yourfile.', "r");
if ($handle) <
while (! feof ($handle)) <
$lines [] = fgets ($handle, 4096);
>
fclose ($handle);
>
?>

Мы представим способ записи массива в файл на PHP с помощью функций print_r() и file_put_contents(). Этот метод записывает указанный массив в указанный файл в системе.

Мы также представим способ печати массива в файл PHP с помощью функций print_r() и fwrite(). Мы используем функцию fopen() для создания файла.

Мы представим постоянное решение для отображения всех ошибок PHP, изменив файл php.ini. Два упомянутых выше метода не помогут отобразить ошибки синтаксического анализа, такие как отсутствие фигурных скобок и точек с запятой.

Используйте функции print_r() и file_put_contents() для записи массива в файл в PHP

Этот метод может создать массив и использовать функцию print_r() для возврата массива и использовать функцию file_put_content() для загрузки массива в файл. Функция print_r() принимает в качестве параметров массив для печати и логическое значение. Логическое значение определяет, будет ли возвращен массив. Значение по умолчанию неверно. Функция file_put_contents() принимает путь к файлу в качестве первого параметра. Второй параметр — это содержимое, которое будет загружено в файл.

Например, создайте ассоциативный массив. Ассоциативный массив — это тип массива, в котором ключами являются строки, а не числа. Создайте ключи как name , age и bike . Назначьте значения Jack , 24 и fireblade в качестве значения ключей. Присвойте массив переменной $b . Используйте функцию print_r() и возьмите параметры $b и логическое значение true. Затем напишите функцию file_put_contents() и укажите файл filename.txt в качестве первого параметра и функцию print_r() выше в качестве второго параметра.

В приведенном ниже примере функция print_r() возвращает информацию о массиве. Он не печатает элементы на веб-странице. Файл filename.txt будет создан в корневом каталоге, где печатается массив.Прочтите print_r() в руководстве по PHP, чтобы узнать больше об этой функции.

Используйте функции fopen() , print_r() и fwrite() для записи массива в файл в PHP

Мы можем использовать метод fwrite() для записи массива в файл. Этот метод создает файл с возможностью записи в каталоге с помощью функции fopen(). Мы можем создать массив и использовать функцию print_r() для возврата массива и использовать функцию fwrite() для записи массива в файл. Функция print_r() принимает в качестве параметров массив для печати и логическое значение.

Используйте функцию fopen() для создания файла file.txt с w в качестве второго параметра. Назначьте функцию fopen() переменной $fp. Используйте функцию print_r() и возьмите параметры $b и логическое значение true. Затем напишите функцию fwrite() и укажите переменную $fp в качестве первого параметра и функцию print_r() выше в качестве второго параметра.

В приведенном ниже примере функция fopen() создает файл file.txt в корневом каталоге. Массив записывается в файл с помощью функции fwrite(). Обратитесь к руководству по PHP, чтобы узнать больше о функции fwrite().

Используйте функции fopen() , var_export() и fwrite() для записи массива в файл

В этом методе мы используем функцию var_export() вместо функции print_r(), чтобы вернуть массив, который необходимо распечатать. Функция var_export() принимает массив для печати и логическое значение в качестве параметров, как и в функции print_r(). Мы создаем доступный для записи файл в каталоге с помощью функции fopen(). Мы используем функцию fwrite() для записи массива в файл, используя массив и функцию var_export() в качестве параметров. Функция var_export() возвращает допустимый PHP-код указанного параметра.

Например, напишите функцию fwrite() и укажите переменную $fp в качестве первого параметра и функцию var_export(), указанную выше, в качестве второго параметра. Укажите переменную $b и логическое значение true в качестве параметров функции var_export().

В приведенном ниже примере функция var_export() приводит к другому результату с точки зрения структуры, а не функции print_r(). Массив, напечатанный функцией var_export(), является действительным кодом PHP и может быть выполнен, в отличие от вывода, сгенерированного функцией print_r(). Пожалуйста, обратитесь к Руководству по PHP, чтобы узнать о функции var_export().

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

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