Fopen s c как использовать
Перейти к содержимому

Fopen s c как использовать

  • автор:

Работа с файлами в PHP

Работа с файлами в PHP

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

Последовательность работы с файлами в PHP такая:

  1. Открыть файл.
  2. Выполнить необходимые действия.
  3. Закрыть файл.

Как видите, последовательность работы с файлами напоминает работу с файлами через обычный проводник. Только здесь вся работа выполняется автоматически самим PHP-скриптом.

Начнём с первого пункта — открытие файла. Файл открывается с помощью функции fopen(). Первый параметр — это путь к файлу, а второй параметр — модификатор. Давайте сразу разберём возможные модификаторы:

  1. a — открывает файл только для записи, причём указатель помещается в конец файла.
  2. a+ — то же самое, что и модификатор a, но также файл открывается ещё и для чтения.
  3. r — открывает файл только для чтения, а указатель устанавливается в начало файла.
  4. r+ — то же самое, что и модификатор r, но также файл открывается ещё и для записи.
  5. w — открывает файл только для записи, указатель устанавливает в начало файла и стирает всё содержимое файла.
  6. w+ — то же самое, что и модификатор w, только файл открывается также и для чтения.

Также различают два режима работы с файлами: бинарный (обозначается b) и текстовый (обозначается t). Если Вы работаете с обычным текстовым файлом, то выбирайте текстовый режим, а если, например, с изображением, то бинарный.

Это все основные модификаторы, которых Вам вполне хватит. Теперь давайте узнаем, как закрыть файл. Закрывается файл с помощью функции fclose().

Теперь перейдём к чтению файла с помощью функции fread(). И давайте, наконец-то, приведу пример:

$handle = fopen(«files/a.txt», «rt»);
$contents = »;
while (!feof($handle))
$contents .= fread($handle, 4096);
fclose($handle);
?>

В данном примере мы сначала открываем файл для чтения в текстовом режиме (модификатор rt). Функция fopen() возвращает так называемый дескриптор, с помощью которого можно общаться с файлом, и записываем его в переменную handle. Затем мы в цикле while() до тех пор, пока не достигнут конец файл, считываем содержимое каждый раз по 4096 символов, которые записываем в переменную contents. После завершения процесса считывания — закрываем файл, вновь с помощью дескриптора файла.

Теперь перейдём к записи с помощью функции fwrite():

$handle = fopen(«files/a.txt», «at»);
$string = «This is text»;
fwrite($handle, $string);
fclose($handle);
?>

После запуска этого скрипта, в файле a.txt добавится строка «This is text«.

Особо внимательные читатели обратили внимание на указатели, о которых я писал чуть выше. Указатель — это текущая позиция воображаемого «курсора» в файле. Именно с него и начинается работа с файлом. Изменить положение указателя можно с помощью функции fseek():

$handle = fopen(«files/a.txt», «rt»);
$contents = fread($handle, 3);
echo $contents.»
«;
fseek($handle, 0, SEEK_SET);
$contents = fread($handle, 3);
echo $contents.»
«;
?>

Таким образом, мы сначала считываем 3 символа (в результате, текущее положение указателя сдвигается на 3 позиции). Затем мы устанавливаем указатель на начало файла. И вновь считываем 3 символа. Как Вы и догадались, мы два раза считали одно и тоже. То есть первый раз 3 символа, потом вернулись назад, и вновь считали 3 символа. Также если у функции fseek() заменить SEEK_SET на SEEK_CUR, то тогда второй параметр будет не устанавливать позицию указателя, а сдвигать относительно текущего местоположения. Советую даже попрактиковаться с указателями, потому что для понимания это не так просто. Также рекомендую попытаться записать что-нибудь в файл при позиции указателя, например, в самом начале файла. И обязательно объясните полученный результат.

И, напоследок, хочется привести ещё пару функций, которые позволяют работать с файлами на самом простом уровне: file_put_contens() и file_get_contents(). Функция file_put_contents() записывает в файл, а функция file_get_contents() считывает содержимое из файла. Эти функции очень просты в применении, но возможностей там уже меньше (хотя, как правило, они и не нужны):

file_put_contents(«files/a.txt», «This is text 2»);
echo file_get_contents(«files/a.txt»);
?>

В данном скрипте мы сначала записали строку «This is text 2» в файл, а потом считываем полученное содержимое и выводим его. Как видите, трудно придумать более простой способ чтения из файла и запись в файл.

Вот и все основные моменты работы с файлами в PHP.

Спасибо за внимание!

Создано 18.11.2010 17:58:21

  • Михаил Русаков
  • Копирование материалов разрешается только с указанием автора (Михаил Русаков) и индексируемой прямой ссылкой на сайт (http://myrusakov.ru)!

    Добавляйтесь ко мне в друзья ВКонтакте: http://vk.com/myrusakov.
    Если Вы хотите дать оценку мне и моей работе, то напишите её в моей группе: http://vk.com/rusakovmy.

    Если Вы не хотите пропустить новые материалы на сайте,
    то Вы можете подписаться на обновления: Подписаться на обновления

    Если у Вас остались какие-либо вопросы, либо у Вас есть желание высказаться по поводу этой статьи, то Вы можете оставить свой комментарий внизу страницы.

    Порекомендуйте эту статью друзьям:

    Если Вам понравился сайт, то разместите ссылку на него (у себя на сайте, на форуме, в контакте):

    1. Кнопка:
      Она выглядит вот так:
    2. Текстовая ссылка:
      Она выглядит вот так: Как создать свой сайт
    3. BB-код ссылки для форумов (например, можете поставить её в подписи):

    Комментарии ( 62 ):

    top1995 21.06.2011 19:35:48

    В этом програмном коде «while (!feof($handle))» перед «feof» стоит символ «!». почему??

    Admin 21.06.2011 19:40:21

    Потому что feof проверяет: достигнут конец файла или нет. Пока он не будет достигнут, будет возвращаться false. Отрицание делает true, а дальше while(true) выполняет следующую итерацию цикла.

    Fopen s c как использовать

    Кто-нибудь провал сравнивать скорость работы функций winapi и сишных, таких как CreateFile и fopen, WriteFile и fwrite, просто, я всегда считал, что «родные функции» должны работать быстрее, а по факту получается, что нет (при создании файла с помощью CreateFile, указываю параметры NORMAL).
    Может необходимо правильно поиграться с флагами, подскажите, пожалуйста, очень необходимо увеличит скорость работы программы !!

    Подумай. Подумал. А теперь подумай о чем ты
    подумал. Подумал. ^
    Re: CreateFile и fopen

    От: Аноним
    Дата: 27.04.08 05:07
    Оценка:

    BAS>Кто-нибудь провал сравнивать скорость работы функций winapi и сишных, таких как CreateFile и fopen, WriteFile и fwrite, просто, я всегда считал, что «родные функции» должны работать быстрее, а по факту получается, что нет (при создании файла с помощью CreateFile, указываю параметры NORMAL).

    Исходники CRT из Visual Studio посмотреть пробовал ?
    fopen() в принципе не может быть быстрее CreateFile(), т.к. fopen() вызывает внутри себя CreateFile().
    Всё зависит от флагов.

    Re[2]: CreateFile и fopen

    От: Сергей Мухин
    Дата: 27.04.08 06:07
    Оценка:

    Здравствуйте, Аноним, Вы писали:

    BAS>>Кто-нибудь провал сравнивать скорость работы функций winapi и сишных, таких как CreateFile и fopen, WriteFile и fwrite, просто, я всегда считал, что «родные функции» должны работать быстрее, а по факту получается, что нет (при создании файла с помощью CreateFile, указываю параметры NORMAL).

    А>Исходники CRT из Visual Studio посмотреть пробовал ?
    А>fopen() в принципе не может быть быстрее CreateFile(), т.к. fopen() вызывает внутри себя CreateFile().
    А>Всё зависит от флагов.

    для fopen — копейки
    для fwrite — буферизация


    С уважением,
    Сергей Мухин
    Re[3]: CreateFile и fopen

    От: Sergey Chadov
    Дата: 27.04.08 06:41
    Оценка:

    Здравствуйте, Сергей Мухин, Вы писали:

    СМ>для fopen — копейки
    СМ>для fwrite — буферизация

    У винды вообще-то тоже буферизация.

    Re[4]: CreateFile и fopen

    От: Сергей Мухин
    Дата: 27.04.08 06:58
    Оценка:

    Здравствуйте, Sergey Chadov, Вы писали:

    SC>Здравствуйте, Сергей Мухин, Вы писали:

    СМ>>для fopen — копейки
    СМ>>для fwrite — буферизация

    SC>У винды вообще-то тоже буферизация.

    тебе видимо видней. Видимо ты замерял.

    Но в С это грубо говоря b[i++] = c на байт (если побайтно выводить). так что скорость не сравниться.


    С уважением,
    Сергей Мухин
    Re[5]: CreateFile и fopen

    От: Sergey Chadov
    Дата: 27.04.08 07:30
    Оценка:

    Здравствуйте, Сергей Мухин, Вы писали:

    СМ>тебе видимо видней. Видимо ты замерял.
    Был в моей биографии такой позорный эпизод

    СМ>Но в С это грубо говоря b[i++] = c на байт (если побайтно выводить). так что скорость не сравниться.
    Не понял ничего здесь.

    Re: CreateFile и fopen

    От: Ovl
    Дата: 27.04.08 10:39
    Оценка:

    Здравствуйте, BAS524, Вы писали:

    BAS>Кто-нибудь провал сравнивать скорость работы функций winapi и сишных, таких как CreateFile и fopen, WriteFile и fwrite, просто, я всегда считал, что «родные функции» должны работать быстрее, а по факту получается, что нет (при создании файла с помощью CreateFile, указываю параметры NORMAL).
    BAS>Может необходимо правильно поиграться с флагами, подскажите, пожалуйста, очень необходимо увеличит скорость работы программы !!

    можно попробовать async IO с overlapped подходом.
    но мой комментарий в другом:
    1) вы уверены что это и есть ваше узкое место? можете привести пример или цифры?
    2) текущий алгоритм не может быть заменен на аналогичный по функционалу, но более оптимальный?

    Read or Die!
    Как правильно задавать вопросы
    Как правильно оформить свой вопрос
    Автор: anvaka
    Дата: 15.05.06
    Re[4]: CreateFile и fopen

    От: Аноним
    Дата: 27.04.08 12:36
    Оценка: +2

    СМ>>для fopen — копейки
    СМ>>для fwrite — буферизация
    SC>У винды вообще-то тоже буферизация.
    Буферизация винды — в ядре делается. А вызов ядра — это вой-вой-вой

    Re[5]: CreateFile и fopen

    От: Sergey Chadov
    Дата: 27.04.08 15:40
    Оценка:

    Здравствуйте, <Аноним>, Вы писали:

    СМ>>>для fopen — копейки
    СМ>>>для fwrite — буферизация
    SC>>У винды вообще-то тоже буферизация.
    А>Буферизация винды — в ядре делается. А вызов ядра — это вой-вой-вой

    Буферизация винды делается независимо от того, используется fwrite или CreateFile. Выключить ее можно только указав флаги FILE_FLAG_NO_BUFFERING и FILE_FLAG_WRITE_THROUGH, но работать с такими файлами — заниятие не из приятных.
    А 2 буферизации не всегда хорошо живут вместе.

    Re[6]: CreateFile и fopen

    От: Аноним
    Дата: 27.04.08 20:20
    Оценка:

    SC>Буферизация винды делается независимо от того, используется fwrite или CreateFile.
    fwrite может делать (и делает в случаем MS CRT) буферизацию через маленький буфер, асссоциированный с FILE структурой. Потому например на 32768 fwrite’ов по одному байду будет всего один WriteFile который запищет все 32768 байт зараз (если буфер конечно 32кб). Эта фигня устанавливается при помощи setvbuf.

    Re[6]: CreateFile и fopen

    От: CreatorCray
    Дата: 28.04.08 08:49
    Оценка:

    Здравствуйте, Sergey Chadov, Вы писали:

    СМ>>>>для fwrite — буферизация
    SC>>>У винды вообще-то тоже буферизация.
    А>>Буферизация винды — в ядре делается. А вызов ядра — это вой-вой-вой
    SC>Буферизация винды делается независимо от того, используется fwrite или CreateFile. Выключить ее можно только указав флаги FILE_FLAG_NO_BUFFERING и FILE_FLAG_WRITE_THROUGH,
    Разница такая: fwrite внутри себя кэширует некоторый объем и вызывает WriteFile для большого блока данных. Т.е. через fwrite можно писать хоть по одному байту — проседать будет незначительно.
    WriteFile — это вызов в ядро, что само по себе тяжелая функция. Переданные через WriteFile данные попадают в кэш винды, которая уже сама определяет когда и какими порциями писать данные на HDD, что еще более медленно чем вызов в ядро. Через WriteFile следует писать большими порциями данных. Как показывает практика, идеалом в большинстве случаев является размер порции данных в 4Кб и выше.

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

    Re: CreateFile и fopen

    От: Pavel Dvorkin
    Дата: 28.04.08 10:46
    Оценка:

    Здравствуйте, BAS524, Вы писали:

    BAS>Кто-нибудь провал сравнивать скорость работы функций winapi и сишных, таких как CreateFile и fopen,

    > WriteFile и fwrite,

    А вот это сильно зависит от того, какими порциями читать. Тут уже про буфер fread/fwrite написали, повторять не буду. Так вот, если читать побайтно или даже строками небольшого размера, то fread будет быстрее. А если читать аккуратно блоками в 16-32 — . 1024 Кб, то от этой внутренней буферизации только вред один, напрасная трата времени и памяти.

    With best regards
    Pavel Dvorkin
    Re[7]: CreateFile и fopen

    От: Sergey Chadov
    Дата: 28.04.08 16:14
    Оценка: +1

    Здравствуйте, CreatorCray, Вы писали:

    CC>Здравствуйте, Sergey Chadov, Вы писали:

    СМ>>>>>для fwrite — буферизация
    SC>>>>У винды вообще-то тоже буферизация.
    А>>>Буферизация винды — в ядре делается. А вызов ядра — это вой-вой-вой
    SC>>Буферизация винды делается независимо от того, используется fwrite или CreateFile. Выключить ее можно только указав флаги FILE_FLAG_NO_BUFFERING и FILE_FLAG_WRITE_THROUGH,
    CC>Разница такая: fwrite внутри себя кэширует некоторый объем и вызывает WriteFile для большого блока данных. Т.е. через fwrite можно писать хоть по одному байту — проседать будет незначительно.
    CC>WriteFile — это вызов в ядро, что само по себе тяжелая функция. Переданные через WriteFile данные попадают в кэш винды, которая уже сама определяет когда и какими порциями писать данные на HDD, что еще более медленно чем вызов в ядро. Через WriteFile следует писать большими порциями данных. Как показывает практика, идеалом в большинстве случаев является размер порции данных в 4Кб и выше.
    Да это так. Но для порций данных больше некоторого n как правило от дополнительной буферизации становится только хуже.

    Re[8]: CreateFile и fopen

    От: Аноним
    Дата: 28.04.08 16:30
    Оценка:

    CC>>WriteFile — это вызов в ядро, что само по себе тяжелая функция. Переданные через WriteFile данные попадают в кэш винды, которая уже сама определяет когда и какими порциями писать данные на HDD, что еще более медленно чем вызов в ядро. Через WriteFile следует писать большими порциями данных. Как показывает практика, идеалом в большинстве случаев является размер порции данных в 4Кб и выше.
    SC>Да это так. Но для порций данных больше некоторого n как правило от дополнительной буферизации становится только хуже.
    Неужели вы правда умаете что создатели рантаймов настолько тупы что не сделали проверку на то что записываемый блок достаточно велик и что не нужно его буферизовать в таком случае? Или что один jg чтото решит в плане производительности записи в файл?

    Re: CreateFile и fopen

    От: dcb-BanDos
    Дата: 29.04.08 07:43
    Оценка:

    Здравствуйте, BAS524, Вы писали:

    BAS>Кто-нибудь провал сравнивать скорость работы функций winapi и сишных, таких как CreateFile и fopen, WriteFile и fwrite, просто, я всегда считал, что «родные функции» должны работать быстрее, а по факту получается, что нет (при создании файла с помощью CreateFile, указываю параметры NORMAL).
    BAS>Может необходимо правильно поиграться с флагами, подскажите, пожалуйста, очень необходимо увеличит скорость работы программы !!

    а ты ни разу не пытался глянуть что такое fopen, fwrite, fflush более глубоко, скажем во время отладки по Step into на этих функциях?!

    Ничто не ограничивает полет мысли программиста так, как компилятор.
    Re[9]: CreateFile и fopen

    От: Sergey Chadov
    Дата: 30.04.08 15:57
    Оценка:

    Здравствуйте, <Аноним>, Вы писали:

    CC>>>WriteFile — это вызов в ядро, что само по себе тяжелая функция. Переданные через WriteFile данные попадают в кэш винды, которая уже сама определяет когда и какими порциями писать данные на HDD, что еще более медленно чем вызов в ядро. Через WriteFile следует писать большими порциями данных. Как показывает практика, идеалом в большинстве случаев является размер порции данных в 4Кб и выше.
    SC>>Да это так. Но для порций данных больше некоторого n как правило от дополнительной буферизации становится только хуже.
    А>Неужели вы правда умаете что создатели рантаймов настолько тупы что не сделали проверку на то что записываемый блок достаточно велик и что не нужно его буферизовать в таком случае? Или что один jg чтото решит в плане производительности записи в файл?

    Ни оди ни сто jg ничего не решают при записи на диск. Но вот изменившаяся стратегия записи(другие размеры блоков в другое время) вполне может. Дисковая подсистема очень капризна и утверждать что «fwrite быстрее потому что там буфер» было бы несколько . ммм. недальновидно

    Re[2]: CreateFile и fopen

    От: Аноним
    Дата: 02.05.08 05:24
    Оценка:

    Здравствуйте, Pavel Dvorkin, Вы писали:

    PD>Здравствуйте, BAS524, Вы писали:

    BAS>>Кто-нибудь провал сравнивать скорость работы функций winapi и сишных, таких как CreateFile и fopen,

    PD>Практически безразлично.

    >> WriteFile и fwrite,

    PD>А вот это сильно зависит от того, какими порциями читать. Тут уже про буфер fread/fwrite написали, повторять не буду. Так вот, если читать побайтно или даже строками небольшого размера, то fread будет быстрее. А если читать аккуратно блоками в 16-32 — . 1024 Кб, то от этой внутренней буферизации только вред один, напрасная трата времени и памяти.

    А что File Mapping не прет?

    Re: CreateFile и fopen

    От: alzt
    Дата: 04.05.08 09:07
    Оценка:

    Здравствуйте, BAS524, Вы писали:

    BAS>Кто-нибудь провал сравнивать скорость работы функций winapi и сишных, таких как CreateFile и fopen, WriteFile и fwrite, просто, я всегда считал, что «родные функции» должны работать быстрее, а по факту получается, что нет (при создании файла с помощью CreateFile, указываю параметры NORMAL).
    BAS>Может необходимо правильно поиграться с флагами, подскажите, пожалуйста, очень необходимо увеличит скорость работы программы !!

    fopen использует CreateFile. Поэтому быстрее быть не может, как уже ответили.
    А можно немного конкретики, т.е. что делает программа, у которой CreateFile является узким местом?
    Проблема скорее возникнет при записи файлов, надо правильно выбрать размер буфера.

    Re[2]: CreateFile и fopen

    От: BAS524
    Дата: 05.05.08 13:40
    Оценка:

    Здравствуйте, alzt, Вы писали:

    A>Здравствуйте, BAS524, Вы писали:

    BAS>>Кто-нибудь провал сравнивать скорость работы функций winapi и сишных, таких как CreateFile и fopen, WriteFile и fwrite, просто, я всегда считал, что «родные функции» должны работать быстрее, а по факту получается, что нет (при создании файла с помощью CreateFile, указываю параметры NORMAL).
    BAS>>Может необходимо правильно поиграться с флагами, подскажите, пожалуйста, очень необходимо увеличит скорость работы программы !!

    A>fopen использует CreateFile. Поэтому быстрее быть не может, как уже ответили.
    A>А можно немного конкретики, т.е. что делает программа, у которой CreateFile является узким местом?
    A>Проблема скорее возникнет при записи файлов, надо правильно выбрать размер буфера.

    В данном случае рассматривается работа СУБД(собственного производства) — кроссплатформенная, соответственно пишется изначально все на С, но при работе с большими обьемами данных захотелось увеличить скорость работы и оптимизировать, начал с того,, что для винды воспользовался апишными функциями и получил более медленную работу!! При любых настройках CreateFile и оптимизации работы WriteFile — fwrite работает быстрее!! И fseek тоже работает быстрее, чем виндовый, вот и думаю, что я сделал не так!!

    Подумай. Подумал. А теперь подумай о чем ты
    подумал. Подумал. ^
    Re[3]: CreateFile и fopen

    От: Sergey Chadov
    Дата: 05.05.08 15:26
    Оценка:

    Здравствуйте, BAS524, Вы писали:

    BAS>В данном случае рассматривается работа СУБД(собственного производства) — кроссплатформенная, соответственно пишется изначально все на С, но при работе с большими обьемами данных захотелось увеличить скорость работы и оптимизировать, начал с того,, что для винды воспользовался апишными функциями и получил более медленную работу!! При любых настройках CreateFile и оптимизации работы WriteFile — fwrite работает быстрее!! И fseek тоже работает быстрее, чем виндовый, вот и думаю, что я сделал не так!!

    Оптимизация записи на диск — очень обширная тема. Не думай что заменой одной стандартной функции на другую можно чего-то добиться.
    Теоретически, максимальная производительность достигается FILE_FLAG_NO_BUFFERING|FILE_FLAG_WRITE_THROUGH|FILE_FLAG_OVERLAPPED + WriteFileEx + свой буффер, оптимизированный под конкретный use case.

    Работа с файлами

    Помимо средств ввода-вывода, работающих со стандартными потоками ввода, вывода и ошибок (фактически, это клавиатура и экран дисплея), в стандартных библиотеках языка программирования Си присутствуют средства для работы с информацией, находящейся на дисках и организованной в виде файлов. Существенно облегчает понимание принципов работы тот факт, что эти функции используют те же принципы, что и функции для ввода-вывода со стандартных устройств. При работе с файлами в языке Си используется понятие файловый дескриптор . Для обозначения указателя на файл зарезервировано специальное ключевое слово FILE — одно из немногих ключевых слов в языке программирования Си, записываемых прописными буквами. Например, FILE *fp; описывает дескриптор файла с именем fp . После объявления файлового дескриптора его необходимо связать с физическим файлом на диске (файла может еще не существовать, если он создается путем открытия его на запись или добавление). Для открытия файла может использоваться стандартная функция fopen : fp=fopen(«<имя файла>«,»»);

    Здесь <имя файла>— строка с именем файла, соответствующая его наименованию в операционной системе. может быть следующим:

    103  «w» — запись;  «r» — чтение;  «a» — добавление. После символа, задающего режим доступа, может идти дополнительный символ, определяющий доступ в текстовом или бинарном режиме. По умолчанию подразумевается текстовый режим доступа. Если файл открывается на чтение и его нет на диске, fopen возвращает NULL — специальное предопределенное значение, в противном случае — указатель на файл (дескриптор). Открытие на запись уже существующего файла предполагает перезапись его содержимого. Открытие на добавление существующего файла предполагает приписывание информации к его концу. Для файлового ввода-вывода существует ряд функций, соответствующих функциям работы со стандартным вводом-выводом, в частности:  fprintf — для вывода в файл;  fscanf — для чтения из файла. Отличие этих функций от scanf и printf заключается лишь в том, что первым аргументом, идущим после открывающей круглой скобки, должен быть дескриптор файла, например: fprintf(fp,»2 + 2 = %f\n», a); После использования файла его необходимо закрыть . Это можно сделать с использованием функции fclose , имеющей такой синтаксис: fclose(< дескриптор файла >); Следующая программа осуществляет ввод строки с клавиатуры, сохранение ее в текстовом файле, чтение строки из файла и вывод ее на экран: /* Пример работы с файлом в языке программирования Си */ #include int main() < FILE *f; char str[40]; printf("Введите строку:");scanf("%s",str); f=fopen("file.txt","w"); if (f==NULL) return –1;

    105 > while (!feof(fp)) // Пока не конец исходного файла < fscanf(fp,"%s",Str); // Читаем строку из исходного файла if (strstr(Str,"пере")!=NULL) sc++; // Считаем подстроки "пере" if (!strcmp("абитуриент",Str)) strcpy(Str,"студент"); // Замена слов if (!feof(fp)) fprintf(fp1,"%s ",Str); >fclose(fp); fclose(fp1); if(remove(«test.txt»)) // Удаляем исходный файл < printf("Ошибка удаления файла"); return 3; >if(rename(«test.bak»,»test.txt»)) // Переименовываем промежуточный файл < printf("Ошибка переименования промежуточного файла"); return -1; >else printf(«Было найдено %d \»пере\»\n»,sc); return 0; > Файл test.txt (пример): «абитуриент сможет перейти через барьер, и наконец стать настоящим человеком, который поступит в вуз и будет переходить с курса на курс, так что абитуриент в конце концов станет настоящим специалистом — инженером!» Обратите внимание на использование в этой программе функций rename и remove из стандартной библиотеки, описываемой заголовочным файлом stdio.h , для переименования и удаления файлов. В программе сначала создается промежуточный файл test.bak , в который из исходного файла копируется вся информация, но слова «абитуриент»

    Добавить комментарий

    Ваш адрес email не будет опубликован. Обязательные поля помечены *