Fgets взять строку из файла


fgets

(PHP 4, PHP 5, PHP 7)

fgets — Читает строку из файла

Описание

Читает строку из файлового указателя.

Список параметров

Указатель на файл должен быть корректным и указывать на файл, успешно открытый функциями fopen() или fsockopen() (и все еще не закрытый функцией fclose() ).

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

До версии PHP 4.3.0, отсутствие этого параметра означало, что длина строки будет равна 1024 символам. Если большинство строк в файле больше 8 килобайт, в целях производительности вашего скрипта стоит указать максимальную длину строки.

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

Возвращает строку размером в length — 1 байт, прочитанную из дескриптора файла, на который указывает параметр handle . Если данных для чтения больше нет, то возвращает FALSE .

В случае возникновения ошибки возвращает FALSE .

Список изменений

Версия Описание
4.3.0 fgets() теперь безопасна для обработки бинарных данных

Примеры

Пример #1 Построчное чтение файла

Примечания

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

Программисты, привыкшие к семантике ‘C’ функции fgets() , должны принимать во внимание разницу в том, каким образом возвращается признак достижения конца файла (EOF).

Смотрите также

  • fgetss() — Читает строку из файла и удаляет HTML-теги
  • fread() — Бинарно-безопасное чтение файла
  • fgetc() — Считывает символ из файла
  • stream_get_line() — Получает строку из потокового ресурса до указанного разделителя
  • fopen() — Открывает файл или URL
  • popen() — Открывает файловый указатель процесса
  • fsockopen() — Открывает соединение с интернет-сокетом или доменным сокетом Unix
  • stream_set_timeout() — Установить значение тайм-аута для потока

Ввод и вывод символьных строк в Си

Пожалуйста, приостановите работу AdBlock на этом сайте.

Итак, строки в языке Си. Для них не предусмотрено отдельного типа данных, как это сделано во многих других языках программирования. В языке Си строка – это массив символов. Чтобы обозначить конец строки, используется символ ‘\0’ , о котором мы говорили в прошлой части этого урока. На экране он никак не отображается, поэтому посмотреть на него не получится.

Создание и инициализация строки

Так как строка – это массив символов, то объявление и инициализация строки аналогичны подобным операциям с одномерными массивами.

Следующий код иллюстрирует различные способы инициализации строк.

Рис.1 Объявление и инициализация строк

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

Вторая строка. Простейший способ инициализации в лоб. Объявляем каждый символ по отдельности. Тут главное не забыть добавить нуль-символ \0 .

Третья строка – аналог второй строки. Обратите внимание на картинку. Т.к. символов в строке справа меньше, чем элементов в массиве, остальные элементы заполнятся \0 .

Четвёртая строка. Как видите, тут не задан размер. Программа его вычислит автоматически и создаст массив символов нужный длины. При этом последним будет вставлен нуль-символ \0 .

Как вывести строку

Дополним код выше до полноценной программы, которая будет выводить созданные строки на экран.

Рис.2 Различные способы вывода строки на экран

Как видите, есть несколько основных способов вывести строку на экран.

  • использовать функцию printf со спецификатором %s
  • использовать функцию puts
  • использовать функцию fputs , указав в качестве второго параметра стандартный поток для вывода stdout .

Единственный нюанс у функций puts и fputs . Обратите внимание, что функция puts переносит вывод на следующую строку, а функция fputs не переносит.

Как видите, с выводом всё достаточно просто.

Ввод строк

С вводом строк всё немного сложнее, чем с выводом. Простейшим способом будет являться следующее:

Функция gets приостанавливает работу программы, читает строку символов, введенных с клавиатуры, и помещает в символьный массив, имя которого передаётся функции в качестве параметра.
Завершением работы функции gets будет являться символ, соответствующий клавише ввод и записываемый в строку как нулевой символ.
Заметили опасность? Если нет, то о ней вас любезно предупредит компилятор. Дело в том, что функция gets завершает работу только тогда, когда пользователь нажимает клавишу ввод. Это чревато тем, что мы можем выйти за рамки массива, в нашем случае — если введено более 20 символов.
К слову, ранее ошибки переполнения буфера считались самым распространенным типом уязвимости. Они встречаются и сейчас, но использовать их для взлома программ стало гораздо сложнее.

Итак, что мы имеем. У нас есть задача: записать строку в массив ограниченного размера. То есть, мы должны как-то контролировать количество символов, вводимых пользователем. И тут нам на помощь приходит функция fgets :

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

Если в ходе выполнения этой программы мы введем строку длиннее, чем 10 символов, в массив все равно будут записаны только 9 символов с начала и символ переноса строки, fgets «обрежет» строку под необходимую длину.

Обратите внимание, функция fgets считывает не 10 символов, а 9 ! Как мы помним, в строках последний символ зарезервирован для нуль-символа.

Давайте это проверим. Запустим программу из последнего листинга. И введём строку 1234567890 . На экран выведется строка 123456789 .

Рис.3 Пример работы функции fgets

Возникает вопрос. А куда делся десятый символ? А я отвечу. Он никуда не делся, он остался в потоке ввода. Выполните следующую программу.

Вот результат её работы.

Рис.4 Непустой буфер stdin

Поясню произошедшее. Мы вызвали функцию fgets . Она открыла поток ввода и дождалась пока мы введём данные. Мы ввели с клавиатуры 1234567890\n ( \n я обозначаю нажатие клавиша Enter ). Это отправилось в поток ввода stdin . Функция fgets , как и полагается, взяла из потока ввода первые 9 символов 123456789 , добавила к ним нуль-символ \0 и записала это в строку str . В потоке ввода осталось ещё 0\n .

Далее мы объявляем переменную h . Выводим её значение на экран. После чего вызываем функцию scanf . Тут-то ожидается, что мы можем что-то ввести, но т.к. в потоке ввода висит 0\n , то функция scanf воспринимает это как наш ввод, и записывается 0 в переменную h . Далее мы выводим её на экран.

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


Исправим последний пример так, чтобы его работа была предсказуемой.

Теперь программа будет работать так, как надо.

Рис.4 Сброс буфера stdin функцией fflush

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

Второй. Не забывайте очищать буфер ввода, если используете функцию fgets .

На этом разговор о вводе строк закончен. Идём дальше.

Практика

Решите предложенные задачи:

Для удобства работы сразу переходите в полноэкранный режим

Исследовательские задачи для хакеров

  1. Проверьте как ведет себя ваш компилятор в случае переполнения буфера.

Использование fgets для чтения строк из файла в C

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

Здесь отображается printf, чтобы я мог видеть, что было прочитано, и вот результат

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

Изменить 1: Я знаю, что он останавливается на символе новой строки, но все еще читает его. Мне интересно, почему он не читает его во время третьей строки и передает четвертую строку вместо того, чтобы дать четвертую строку четвертую строку источника, но это происходит только один раз. Файл отформатирован следующим образом:

Как уже было сказано, если в буфере достаточно места, то fgets() считывает данные, включая новую строку, в буфер, а нуль завершает линию. Если в буфере недостаточно места, прежде чем пересечь новую строку, fgets() копирует то, что может (длина буфера минус один байт), а null завершает строку. Библиотека возобновляет чтение с того места, где fgets() осталось на следующей итерации.

Не связывайтесь с буферами размером менее 2 байтов.

Обратите внимание, что gets() удаляет новую строку (но не защищает вас от переполнения буфера, поэтому не используйте ее). Если все будет по-прежнему запланировано, gets() будет удалено из следующей версии стандарта C; это будет долгое время, прежде чем он будет удален из библиотек C (он просто станет нестандартной или ex-standard — дополнительной функцией, доступной для злоупотреблений).

Ваш код должен проверять каждый из вызовов функций fgets() :

Есть места для циклов do/while; они не используются очень часто.

fgets перестает читать при чтении новой строки, но новая строка считается допустимым символом и включается в возвращаемую строку.

Если вы хотите удалить его, вам нужно обрезать его самостоятельно:

Где str — строка, в которую вы читаете данные из файла, а length имеет тип size_t .

Чтобы ответить на вопрос редактирования: причина, по которой новая строка не читается во время третьего чтения, заключается в том, что вы не читаете достаточно символов. Вы даете fgets предел в 12 символов, что означает, что он может читать максимум 11 символов, поскольку он должен добавить нулевой ограничитель в конец.

Вычитаемая строка имеет длину 11 символов перед новой строкой. Обратите внимание: в конце этой строки есть пробел:

Как fgets() определенная строка из файла в C?

5 gfppaste [2011-11-18 01:14:00]

Итак, я пытаюсь найти способ fgets() определенной строки в текстовом файле на C, чтобы скопировать содержимое строки в более постоянный буфер:

По сути, мне было интересно, есть ли способ сделать это без чего-то похожего на следующий код:

Так что в основном я не хочу перебирать файл n-1 раз, чтобы добраться до n-й линии. это просто не кажется очень эффективным (и, если это домашняя работа, мне нужно получить 100 % haha).

Любая помощь будет оценена.

c filestream fgets

5 ответов

Если вы ничего не знаете о файле, вы не можете получить доступ к определенным строкам наугад. Новые строки ограничены наличием символов конца строки, и они могут, в общем, встречаться в любом месте. Текстовые файлы не содержат карту или индекс, которые позволят вам перейти к строке n th .

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

Если вы знаете длину каждой строки, вы можете использовать fseek для перехода к нужной строке.

В противном случае вам нужно пройти все строки.

Во-первых, ваша линия

лучше писать как:

+ 1 необходим, чтобы предоставить место для завершения символа » \0 «; strlen() не учитывает это. Выполнение результата malloc() в C не требуется, и в некоторых случаях может маскировать ошибки. sizeof(char) равен 1 по определению, так что не нужно.

И вы никогда не меняете значение targetline , поэтому ваш цикл никогда не завершится.

Но в ответ на ваш вопрос, если у вас есть текстовый файл, и вы хотите прочитать N-ю строку, вам нужно прочитать и пропустить первые строки N-1, чтобы добраться до него. (Можно создать отдельный индекс, но для создания индекса требуется чтение через файл в любом случае, и сохранение индекса по мере изменения файла является трудной проблемой, вероятно, за пределами того, что вы делаете сейчас. И это не особенно необходимо; время чтения 10 строк из файла не будет заметно.)

Я боюсь, нет другого способа получить n-ю строку в файле. Вы должны пройти. В файле нет случайных совпадений.

Если вы хотите получить n-ю строку из текстового файла, вам нужно прочитать n-1 строки перед ним. Это характер последовательного файла. Если вы не знаете, что все ваши линии имеют одинаковую длину, нет никакого способа надежно позиционировать начало первой строки.

Как fgets () определенную строку из файла в C?

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

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

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

Любая помощь будет оценена.

Если вы знаете длину каждой строки, вы можете использовать FSEEK для перехода к линии, которую вы хотите.

В противном случае, вы должны пройти через все линии.

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

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


Во-первых, ваша линия

лучше записать в виде:

+ 1 Необходимо , чтобы обеспечить место для завершающего « \0 » характер; strlen() не учитывает это. Кастинг результата malloc() в C нет необходимости, а в некоторых случаях могут маскировать ошибки. sizeof(char) 1 , по определению, так что это не нужно.

И вы никогда не измените значение targetline , так что ваш цикл никогда не кончится.

Но в ответ на ваш вопрос, если у вас есть текстовый файл, и вы хотите, чтобы прочитать Nth линии этого, вы должны прочитать и пропустить первые N-1 строки, чтобы добраться до него. (Можно создать отдельный индекс, но и создание индекса требует чтения через файл в любом случае, и сохранить текущий индекс, как изменения файла является сложной проблемой, вероятно, за то, что вы делаете сейчас и это не особенно нужно. время, чтобы прочитать 10 строк из файла не будет заметно.)

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

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

В этой статье мы узнаем, как считывать данные из файлов и записывать информацию в файлы в программах си. Файлы в си используются для того, чтобы сохранять результат работы программы си и использовать его при новом запуске программы . Например можно сохранять результаты вычислений , статистику игр.
Чтобы работать с файлами в си необходимо подключить библиотеку stdio.h
#include
Чтобы работать с файлом в си необходимо задать указатель на файл по образцу
FILE *имя указателя на файл;
Например
FILE *fin;
Задает указатель fin на файл
Дальше необходимо открыть файл и привязать его к файловому указателю. Для открытия файла в си на чтение используется команда
Имя указателя на файл= fopen(«путь к файлу», «r»);
Например следующая команда
fin = fopen(«C:\\Users\\user\\Desktop\\data.txt», «r»);
откроет файл data.txt, находящийся на рабочем столе по пути C:\\Users\\user\\Desktop Чтобы узнать путь к файлу можно выбрать файл мышью нажать на правую кнопку мыши и выбрать свойства файла. В разделе Расположение будет указан путь к файлу. Обратите внимание , что в си путь указывается с помощью двух слешей.
После работы с файлом в си , необходимо его закрыть с помощью команды
fclose(имя указателя на файл)

Считывание информации из текстового файла в Си

Чтобы можно было считывать русские символы из файла, необходимо настроить работу с Кириллицей с помощью команды
setlocale(LC_ALL, «Russian»);

При этом необходимо в начале программы подключить #include

Как взять строку из файла?

Есть обычный текстовый документ count.txt. В нем записано число 10. Как с помощью PHP достать из файла число, прибавить к нему произвольное число в диапазоне от 0,1 до 0,6 и переписать файл (заменить 10 на получившееся число)?

2 ответа 2

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

ООП стиль

Решение в одну строку

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

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

Fgets взять строку из файла

При работе с текстовыми файлами граздо проще работать с данными не как с отдельными символами, а как со строками с помощью функций gets() и puts() .

Функция puts() записывает в файл строку, то есть набор символов, который завершается символом ‘\0’. Она имеет следующий прототип:

Первый параметр функции — записываемая строка, а второй — указатель на файловый поток. В качестве результата функция возвращает неотрицательное целое число. При ошибках в процессе записи возвращается значение EOF .

При записи строки нулевой символ ‘\0’ в файл не записывается.

Функция fgets() считывает из файла одну строку и имеет следующий прототип:

Первый параметр char *s представляет строку, в которую производится считывание. Второй параметр — число n указывает, сколько символов необходимо считывать. И третий параметр представляет файловый поток, из которого производится считывание.

При вызове функция считывает из файла не более n-1 символов. Функция прекращает чтение, когда прочтет n-1 символов или встретит символ переноса строки \n. Все считанные символы записываются в строку s, в том числе символ \n. И также конец каждой строки дописывается нулевой символ ‘\0’.

При успешном завершении функция возвращает указатель s, а при ошибке или достижении конца файла возвращается значение NULL .

Применим функции в программе:

Вначале открываем файл на запись и с помощью вызова fputs(message, fp) записываем в файл искомую строку. Затем открываем файл на чтение и в цикле считываем из файла по 256 символов и выводим их на консоль с помощью вызова fgets(cc, 256, fp) . Когда данные в файле закончатся, функция возвратит NULL, и произойдет выход из цикла.

Другой пример работы с текстовыми файлами — копирование содержимого из одного файла в другой:

Fgets взять строку из файла

Контакты: о проблемах с регистрацией, почтой и по другим вопросам пишите сюда — alarforum@yandex.ru, проверяйте папку спам! Обязательно пройдите активизацию e-mail.

Форум программистов > C++ > Общие вопросы C/C++
Помогите разобраться с функциями fgets (), fputs()
Регистрация
Поиск по форуму
Расширенный поиск
К странице.

Здесь нужно купить рекламу за 25 тыс руб в месяц! ) пишите сюда — alarforum@yandex.ru

Ваша тема закрыта, почему это могло произойти? Возможно,
Название темы включает слова — «Помогите», «Спасите», «Срочно»
Название темы не отражает сути вашего вопроса.
Тема исчерпала себя, помните, один вопрос — одна тема
Прочитайте >>>правила
05.04.2009, 12:29 #1
05.04.2009, 12:35 #2
fgets — взять строку из файла
Описание

Считывает литеры из потока fp в строку по указателю
str. Чтение заканчивается, когда встречается литера
`\n’ (новая строка), конец файла, возникает ошибка чте-
ния или число прочитанных литер достигает n-1. Строка
завершается 0. Литера ‘\n’ (новая строка) включается в
строку (перед 0).

#include
char *fgets(char *str, int n, FILE *fp); /* ANSI */

Возвращает строку str в случае успеха. Если не было
прочитано ни одной литеры и произошла ошибка чтения
или встречен EOF, возвращает NULL, а строка str оста-
ется без изменения. Если возникла ошибка при чтении,
возвращает NULL, а в строке возможен мусор.

fputs — запись строки в файл
Описание

Записывает строку ‘s’, исключая завершающую литеру О,
в поток fp

#include
int fputs(char *s, FILE *fp); /* ANSI */

Возвращает 0 в случае успеха и не 0 при ошибке записи.

Работа со строками: fgets() и fputs()

Файловая система ввода/вывода С содержит две функции, которые могут читать или писать стро¬ки в поток — fgets() и fputs(). Они имеют следующие прототипы:

int fputs(const char *str, FILE *fp);

char *fgets(char *str, int длина, FILE *fp);

Функция fputs() во многом подобна puts(), за тем исключением, что она записывает строку в указанный поток. Функция fgets() читает строку из указанного потока, пока не встретится сим¬вол новой строки или не будет прочитано (длина — 1) символов. Если прочитан символ новой строки, то он станет частью строки (в противоположность gets()). В обоих случаях результирую¬щая строка завершается нулевым символом. Функция возвращает str в случае успеха и нулевой указатель — в случае ошибки.
Можно использовать fgets() как альтернативу gets(). Чтобы сделать это, надо просто указать stdin как указатель на файл. Например, следующая про¬грамма читает до 79 символов, полученных из стандартного ввода:

#include
int main(void)
<
char s[80];
printf(«Enter a string: «);
fgets(s, 80, stdin);
printf («Here is your string: %s», s);
return 0;
>

Преимущество использования fgets() над gets() состоит в том, что можно предотвратить перепол¬нение массива ввода. Массив может содержать символ новой строки.

Илон Маск рекомендует:  Уроки MS PowerPoint 2003 и 2007
Понравилась статья? Поделиться с друзьями:
Кодинг, CSS и SQL