Как сохранить массив в файл c
Обновлено: 21.11.2024
В этом руководстве мы узнаем, как выполнять операции ввода-вывода (I/O) над файлом с помощью языка программирования C.
Файловый ввод-вывод C – Содержание
Прежде чем мы подробно обсудим каждую операцию, давайте возьмем простую программу на C:
Простая программа на C для открытия, чтения и закрытия файла
В приведенной выше программе мы открываем файл newfile.txt в режиме r, считываем содержимое файла и отображаем его на консоли. давайте подробно разберем каждую операцию:
1. Открытие файла
Функция fopen() используется для открытия файла.
Синтаксис:
pointer_name может быть любым по вашему выбору.
имя_файла — это имя файла, который вы хотите открыть. Укажите здесь полный путь, например «C:\\myfiles\\newfile.txt».
При открытии файла необходимо указать режим. Режим, который мы используем для чтения файла, — «r», то есть «режим только для чтения».
например:
Адрес первого символа хранится в указателе fp .
Как проверить, успешно ли открылся файл?
Если файл не открывается успешно, то указателю будет присвоено значение NULL, поэтому вы можете написать логику следующим образом:
Этот код проверит, успешно ли открылся файл или нет. Если файл не открывается, пользователю будет показано сообщение об ошибке.
Различные режимы открытия файлов:
Файл открывается с помощью функции fopen(), при открытии вы можете использовать любой из следующих режимов в соответствии с требованиями.
Режим «r»: это режим только для чтения, что означает, что если файл открыт в режиме r, он не позволит вам записывать и изменять его содержимое. Когда fopen() успешно открывает файл, она возвращает адрес первого символа файла, иначе возвращает NULL.
Режим «w»: это режим только для записи. Функция fopen() создает новый файл, когда указанный файл не существует, и если ей не удается открыть файл, она возвращает NULL.
Режим «a»: в этом режиме содержимое может быть добавлено в конец существующего файла. Подобно режиму «w», fopen() создает новый файл, если он не существует. При неудачном открытии возвращает NULL.
Указатель файла указывает на: последний символ файла.
Режим «r+»: этот режим аналогичен режиму «r»; однако вы можете выполнять различные операции с файлом, открытым в этом режиме. Вам разрешено читать, записывать и изменять содержимое файла, открытого в режиме «r+».
Указатель файла указывает на: Первый символ файла.
Режим «w+»: такой же, как режим «w», за исключением операций, которые можно выполнять; файл можно читать, записывать и изменять в этом режиме.
Режим «а+»: такой же, как режим «а»; вы можете читать и добавлять данные в файл, однако изменение содержимого в этом режиме запрещено.
2. Чтение файла
Чтобы прочитать файл, мы должны сначала открыть его в любом из режимов, например, если вы хотите только прочитать файл, откройте его в режиме «r». В зависимости от режима, выбранного при открытии файла, нам разрешено выполнять определенные операции с файлом.
Программа на C для чтения файла
fgetc(): эта функция считывает символ с текущей позиции указателя и при успешном чтении перемещает указатель на следующий символ в файле. Как только указатели достигают конца файла, эта функция возвращает EOF (конец файла). Мы использовали EOF в нашей программе для определения конца файла.
3. Запись в файл
Чтобы записать файл, мы должны открыть файл в режиме, поддерживающем запись. Например, если вы откроете файл в режиме «r», вы не сможете записать файл, так как «r» — это режим только для чтения, который разрешает только чтение.
Пример: программа на C для записи файла
Эта программа просит пользователя ввести символ и записывает этот символ в конец файла. Если файл не существует, то эта программа создаст файл с указанным именем и запишет в него введенный символ.
4. Закрытие файла
Функция fclose() используется для закрытия открытого файла. В качестве аргумента вы должны предоставить указатель на файл, который вы хотите закрыть.
Пример, показывающий операции открытия, чтения, записи и закрытия в C
Как читать/записывать (I/O) строки в файлах — fgets и fputs
Здесь мы обсудим, как читать и записывать строки в файл.
s: массив символов для хранения строк.
rec_len: Длина входной записи.
fpr: Указатель на входной файл.
Давайте рассмотрим пример:
Пример чтения строк из файла в программировании на C
В приведенном выше примере мы использовали функцию fgets следующим образом:
Здесь str представляет собой строку (массив символов), в которой вы сохраняете строку после ее чтения из файла.
10 – это длина строки, которую необходимо читать каждый раз.
fpr — указатель на файл, который будет прочитан.
Почему я использовал if(fgets(str, 10, fpr)==NULL в качестве логики для определения конца файла?
В приведенных выше примерах мы использовали ch==EOF, чтобы узнать конец файла. Здесь мы использовали эту логику, потому что fgets возвращает NULL, когда больше нет записей, доступных для чтения.
Программа на C — запись строки в файл
char *s — массив символов.
FILE *fpw — Указатель (типа FILE) на файл, который будет записан.
fputs принимает два аргумента —
str — строка представляет собой массив, в котором хранится строка.
fpw — указатель FILE на выходной файл, в который необходимо записать запись.
Обратите внимание на fputs:
fputs по умолчанию не добавляет новую строку после записи каждой записи, чтобы сделать это вручную — вы можете использовать следующий оператор после каждой записи в файл.
C FILE I/O для двоичных файлов
До сих пор мы изучали файловые операции с текстовыми файлами, что делать, если файлы являются двоичными (например, файл .exe). Вышеупомянутые программы не будут работать с двоичными файлами, однако есть небольшое изменение в обработке двоичных файлов. Основное отличие заключается в имени файла и режимах. Давайте поймем это с помощью примера. Допустим, у меня есть два бинарных файла bin1.exe и bin2.exe — я хочу скопировать содержимое bin1.exe в bin2.exe:
Пример: чтение и запись двоичных файлов в C
Примечание. Режимы открытия файлов — «rb» и «wb» вместо «r» и «w».
До сих пор мы использовали текстовый режим для чтения и записи данных в файл и из него. В этой главе мы узнаем, как мы можем читать и записывать данные в файл и из него, используя двоичный режим. Напомним, что в двоичном режиме данные хранятся в файле так же, как и в памяти, поэтому в двоичном режиме не происходит никакого преобразования данных. Поскольку преобразование не происходит, двоичный режим работает значительно быстрее, чем текстовый.
Функции fread() и fwrite() обычно используются для чтения и записи двоичных данных в файл и из него соответственно. Хотя мы также можем использовать их и в текстовом режиме.
Начнем с функции fwrite().
Синтаксис: size_t fwrite(const void *ptr, size_t size, size_t n, FILE *fp);
Функция fwrite() записывает в файл данные, указанные указателем void ptr.
ptr : указывает на блок памяти, содержащий элементы данных для записи.
size : указывает количество байтов каждого записываемого элемента.
n : количество записываемых элементов.
fp : это указатель на файл, в который будут записаны элементы данных.
В случае успеха возвращается количество элементов, успешно записанных в файл. При ошибке возвращается число меньше n . Обратите внимание, что два аргумента ( size и n ) и возвращаемое значение fwrite() имеют тип size_t, который в большинстве систем имеет тип unsigned int.
Чтобы лучше понять функцию fwrite(), рассмотрим следующие примеры:
Пример 1. Запись переменной
Это записывает значение переменной f в файл.
Пример 2. Запись массива
Это записывает весь массив в файл.
Пример 3. Запись некоторых элементов массива
Это записывает в файл только первые два элемента массива.
Пример 4. Написание структуры
Это записывает содержимое переменной student_1 в файл.
Пример 5: Запись массива структуры
Это записывает весь массив студентов в файл.
Допустим, мы не хотим записывать все элементы массива в файл, вместо этого мы хотим записать в файл только 0-й и 1-й элементы массива.
Теперь вы поняли, как работает функция fwrite(). Давайте создадим программу, используя функцию fwrite().
В следующей программе показано, как использовать функцию fwrite().
Ожидаемый результат:
Как это работает:
В строках 4–10 объявляется структура employee, состоящая из четырех членов, а именно: name — массив символов, обозначение — также массив символов, age — тип int, а зарплата — float. Наряду с определением структуры также объявляется переменная emp типа struct employee.
В строке 14 объявлены три переменные n, i и chars типа int.
В строке 15 объявляется указатель структуры fp типа struct FILE.
В строке 17 функция fopen() вызывается с двумя аргументами, а именно "employee.txt" и "wb". В случае успеха он возвращает указатель на файл employee.txt и открывает файл employee.txt в режиме только для записи. В случае ошибки возвращается NULL.
В строках 19–23 оператор if используется для проверки значения fp. Если он равен NULL, оператор printf() выводит сообщение об ошибке и программа завершает работу. В противном случае программа продолжает работу с оператором, следующим за оператором if.
В строках 27–28 программа запрашивает у пользователя, сколько записей он хочет ввести, и сохраняет число в переменной n.
В строках 30–50 операторы цикла for просят пользователя ввести четыре элемента информации, а именно имя, должность, возраст и зарплату.Обратите внимание, что в строке 34 вызывается функция fflush() для сброса (удаления) символа новой строки из стандартного ввода, который был введен при вводе количества записей в строке 28. Если не было вызова fflush(stdin), то gets( ) в строке 37 считывала бы символ новой строки из стандартного ввода и не ждала ввода пользователя. В строке 48 вызывается функция fwrite() для записи структурной переменной emp в файл в двоичном режиме. Мы уже знаем, что в случае успеха fwrite() возвращает количество элементов, записанных в файл. Здесь мы записываем данные одной структурной переменной, поэтому fwrite() вернет 1. В случае ошибки она вернет число меньше 1. Затем возвращаемое значение fwrite() присваивается переменной chars. В строке 49 оператор printf() выводит количество элементов, успешно записанных в файл.
В строке 52 функция fclose() используется для закрытия файла.
сообщить об этом объявлении
сообщить об этом объявлении
Код C Поиск чисел Армстронга в диапазоне — логика для поиска всех чисел Армстронга от 1 до n. Введите Верхний предел, чтобы распечатать номер Армстронга от пользователя. Сохраните его в какой-нибудь переменной, скажем, end. Запуск цикла от 1 до конца, увеличение
Функции вставки, обновления и удаления значений. Этот программный код на C++ полезен для управления меню «база данных» с использованием массива и показывает, как предотвратить неправильный ввод. Просто познакомить с базовым управлением базой данных
Печатать только уровни дерева с нечетными номерами. В этом методе две функции. Один из них заключается в печати всех узлов на заданном уровне ("printGivenLevel"), а другой - в "печати обхода порядка уровней" дерева ("printLevelorder"). порядок печати
Проверить, может ли число быть выражено в виде суммы. Программа проверяет, может ли число быть выражено в виде суммы двух простых чисел. Для выполнения этой задачи создается функция "checkPrime()". "checkPrime()" возвращает 1, если
Подсчет гласных и согласных в предложении. Возьмите предложение в качестве входных данных, сохраните в массиве предложение[] и инициализируйте гласные, согласные и специальные переменные равными нулю. Используя операторы if, else, проверьте, есть ли в предложении гласные
Отображать собственный исходный код в качестве вывода. Отображает содержимое того же файла, в котором вы пишете исходный код. Откройте файл, который вы сейчас пишете, с помощью оператора fopen и назначьте его указателю fp. Сканировать каждый
Принять два целых числа и проверить, являются ли они правильными. Возьмите два целых числа в качестве входных данных и сохраните их в переменных x и y соответственно. Используя операторы if, else, проверяют, равен ли x значению y. Если они равны, выведите вывод как «x и y равны».
Распечатать числа Армстронга от 1 до 1000. Программный код напечатает число Армстронга от 1 до 1000. Число Армстронга – это n-значное число с основанием b, такое что сумма его (основания b) цифр, возведенных в степень n, равна номер
сообщить об этом объявлении
(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:\". Как мне файл() это?
Не забывайте, что обратная косая черта является специальной, и вы должны «экранировать» обратную косую черту, т. е. «\\»:
= файл ("C:\\Documents and Settings\\myfile.txt");
foreach($lines as $line)
echo( $line);
>
надеюсь, это поможет.
Чтобы записать все строки файла, другими словами, прочитать файл построчно, вы можете написать такой код:
= 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"),
('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:
= rtrim ( $line , "\r\n" ) . PHP_EOL;
?>
Это удаляет только символы EOL и заменяет их символом EOL сервера, что позволяет preg_* нормально работать при сопоставлении EOL ($)
Примечание. Теперь, когда file() является двоично-безопасным, он "намного" медленнее, чем раньше. Если вы планируете читать большие файлы, возможно, стоит использовать fgets() вместо file(). Например:
= 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 вернет массив со всеми строками.
= @ fopen('yourfile.', "r");
if ($handle) <
while (! feof ($handle)) <
$lines [] = fgets ($handle, 4096);
>
fclose ($handle);
>
?>
Читайте также: