Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.83/202: Рейтинг темы: голосов - 202, средняя оценка - 4.83
11 / 11 / 6
Регистрация: 03.04.2011
Сообщений: 631

Как использовать функцию fgets?

12.10.2011, 15:53. Показов 43044. Ответов 26
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Люди прочитал тут про функцию fgets() но как то понять до конца не могу поясните плиз кто понимает и работал с ней уже... А нашел такую информацию:
Функция fgets() читает из входного потока stream не более num-1 символов и помещает их в массив символов, адресуемый указателем str. Символы, читаются до тех пор, пока не будет прочитан символ новой строки или значение EOF, либо пока не будет достигнут заданный предел. По завершении чтения символов сразу же за последним из них размешается нулевой символ. Символ новой строки сохраняется и становится частью массива, адресуемого элементом str.
(что за входной поток? и как понять не более num-1 символов?)
вот такое пример был дан
Приведенная программа использует функцию fgets() для вывода содержимого текстового файла, имя которого задано первым аргументом командной строки.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
#include <stdio.h>
#include <stdlib.h>
int main(int argc, char *argv[])// вот тут первая переменная которая как инт обозначенна нужна?
{
   FILE *fp;// тут указатель на что? на то что fp будет работать с файлом? или не совсем так?
   char str[128];//тут массив символов размером 128? так?
   
   if((fp=fopen(argv[1], "r")) == NULL) // если не прочиталось то выход?
   {
      printf("Не удаётся открыть файл.\n");
      exit(1);
   }
 
   while(!feof(fp))// цикл пока не будет достигнут конец файла
   {
      if(fgets(str, 126, fp))// вот тут не понимаю словесно можите пояснить? че куда и как?
         printf("%s", str);// ну тут вывод стоки  только что значит "%S"
   }
   fclose(fp);
 
return 0;
}
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
12.10.2011, 15:53
Ответы с готовыми решениями:

Как использовать getline и fgets?
#include &lt;iostream&gt; #include &lt;fstream&gt; #include &lt;string&gt; using std::ofstream; using std::cout; using std::endl; using...

Как заменить функцию fgets на strlen и strcpy?
while (fgets(s1, sz_line, fp)) //будет прочитано 120 символов { // считаем длину текущей строки , будет в j j = 0; while...

Как в C++ использовать функцию inc(); ?
подскажите пожалуйста, как вот это: inc(b); можно сделать в С++?

26
Эксперт С++
 Аватар для Nameless One
5828 / 3479 / 358
Регистрация: 08.02.2010
Сообщений: 7,448
12.10.2011, 16:22
Цитата Сообщение от lexflax Посмотреть сообщение
что за входной поток?
объект типа FILE* - обычно либо stdin, либо открытий на чтение функцией fopen файл
Цитата Сообщение от lexflax Посмотреть сообщение
как понять не более num-1 символов?
в прямом смысле, если в данном случае доступно для чтения больше чем num-1 байт, то читается num - 1 байт, затем в массив записывается символ '\0', а остальной ввод игнорируется
1
290 / 193 / 23
Регистрация: 03.08.2011
Сообщений: 2,824
Записей в блоге: 12
12.10.2011, 16:37
printf("%s", str);// ну тут вывод стоки только что значит "%S"
%s значит что будет выводится строка то есть последовательность символо пока не встреатится символ с кодом ноль который обозначает конец файла

Добавлено через 4 минуты
fgets(str, 126, fp) будет прочитано 126 символов (размер переменнй для записи строки 127 символов последний 127 str[126] используется для вставки символа с кодом ноль) если программа встретит в файле символ с кодом \n раньше чем считает 126 символов то считывание закончится
0
11 / 11 / 6
Регистрация: 03.04.2011
Сообщений: 631
12.10.2011, 17:00  [ТС]
а если в файле допустим 3 три строки и всего 280 символов тогда как будет обработка происходить?
0
Эксперт С++
 Аватар для Nameless One
5828 / 3479 / 358
Регистрация: 08.02.2010
Сообщений: 7,448
12.10.2011, 17:07
lexflax, в любом случае, fgets читает либо до символа '\n', либо пока не прочитает num - 1 символов. Если у тебя размер буфера заведомо больше, чем размер одной строки, то за один вызов fgets из файла прочитается ровно одна строка (причем символ '\n' сохранится в буфере). Т.е, допустим, у тебя есть файл со следующим содержимым:
Code
1
2
3
foo
bar
baaz
И буфер buf, в который ты производишь чтение из файла:
C
1
2
char buf[128];
fgets(buf, 128, file);
После выполнения однократного чтения с помощью fgets ты получишь buf = "foo\n"

Если же у тебя есть файл:
Code
1
2
a very long line
another line
и
C
1
2
char buf[5];
fgets(buf, 5, file);
то после чтения из файла ты получишь buf = "a ve"
0
11 / 11 / 6
Регистрация: 03.04.2011
Сообщений: 631
12.10.2011, 17:12  [ТС]
ну допустим у меня в первой строке 150 символом то в том листенге что выше не правильно будет, он не сможет все считать потому что там максимум 128 символов забито так? и второй вопрос допустим мне надо считать 3 строки из файла разной длинны какой код подойдет для этого можите написать ?
0
290 / 193 / 23
Регистрация: 03.08.2011
Сообщений: 2,824
Записей в блоге: 12
12.10.2011, 17:13
Если у тебя размер буфера заведомо больше, чем размер одной строки, то за один вызов fgets из файла прочитается ровно одна строка

а если буфер меньше то следующее чтение будет со следующея строки?
0
Эксперт С++
 Аватар для Nameless One
5828 / 3479 / 358
Регистрация: 08.02.2010
Сообщений: 7,448
12.10.2011, 17:17
Цитата Сообщение от Van111 Посмотреть сообщение
а если буфер меньше то следующее чтение будет со следующея строки?
если буфер меньше, то следующее чтение будет с того места, где закончилось предыдущее чтение.
1
Эксперт С++
 Аватар для Nameless One
5828 / 3479 / 358
Регистрация: 08.02.2010
Сообщений: 7,448
12.10.2011, 17:27
Цитата Сообщение от Nameless One Посмотреть сообщение
если буфер меньше, то следующее чтение будет с того места, где закончилось предыдущее чтение.
чтобы не быть голословным, вот пример чтения по одному символу со стандартного ввода с помощью fgets:
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#include <stdio.h>
#include <stdlib.h>
 
int main()
{
    char buf[2];
 
    while(fgets(buf, 2, stdin) != NULL)
    putchar(*buf);
 
    if(ferror(stdin))
    fputs("Input error occured\n", stderr);
    
    exit(0);
}
А вот само чтение:
Code
1
2
3
[nameless@laptop c]$ echo input from stdin | ./sample 
input from stdin
[nameless@laptop c]
2
11 / 11 / 6
Регистрация: 03.04.2011
Сообщений: 631
13.10.2011, 14:31  [ТС]
вот такое накидал как понял но не работает посмотрите плиз, хотел чтоб из файла с именем сайв считывалось все в переменную filename, потом открывалось на чтение а потом считывалось все по строчно в нем , и выводилось так же по строчно, че я не так написал ? или не так понял ? поясните плиз...
C++
1
2
3
4
5
6
7
8
9
10
11
12
#include <iostream>
#include <conio.h>
main()
{
char filename[] = {"save.txt"};
FILE *fp;
char temp[100];
fp = fopen(filename, "r");
while (fgets(temp, 100, fp) != NULL)
printf("%s", temp)
fclose(fp);
getch();}
}
0
Эксперт С++
 Аватар для Nameless One
5828 / 3479 / 358
Регистрация: 08.02.2010
Сообщений: 7,448
13.10.2011, 16:02
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
#include <stdio.h>
#include <stdlib.h>
 
#define SIZE 100
 
int main()
{
    const char* filename = "save.txt";
    FILE* fp;
 
    int exit_status = EXIT_SUCCESS;
    
    char buf[SIZE];
 
    /* обработка ошибки открытия файла */
    if((fp = fopen(filename, "r")) == NULL)
    {
    perror(filename);
    exit_status = EXIT_FAILURE;
    goto ret;
    }
    
    while(fgets(buf, SIZE, fp))
    fputs(buf, stdout);
 
    /* обработка ошибки чтения из файла */
    if(ferror(fp))
    {
    perror(filename);
    exit_status = EXIT_FAILURE;
    goto ret_close;
    }
 
ret_close:    
    fclose(fp);
ret:    
    exit(exit_status);
}
1
11 / 11 / 6
Регистрация: 03.04.2011
Сообщений: 631
14.10.2011, 14:22  [ТС]
Цитата Сообщение от Nameless One Посмотреть сообщение
EXIT_SUCCESS;
эта строчка что означает?

(perror(filename);
exit_status = EXIT_FAILURE;
goto ret
вот тут не пойму тоже что за слова использованны и какие у них действия поясните плиз желательно по всему листингу комменты
0
Эксперт С++
 Аватар для Nameless One
5828 / 3479 / 358
Регистрация: 08.02.2010
Сообщений: 7,448
14.10.2011, 14:49
Цитата Сообщение от lexflax Посмотреть сообщение
EXIT_SUCCESS;
макрос, раскрывающийся в код удачного завершения программы, который мы и возвращаем системе с помощью функции exit

perror - функция, печатающая сообщение об ошибке

goto ret - переход на метку ret
1
11 / 11 / 6
Регистрация: 03.04.2011
Сообщений: 631
14.10.2011, 15:02  [ТС]
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
#include <iostream>
#include <conio.h>
#include <stdio.h>
using namespace std;
main()
{
char filename[] = {"save.txt"};
FILE *fp;
char temp[100];
fp = fopen(filename, "r");
while (fgets(temp, 100, fp) != NULL)
cout << temp;
fclose(fp);
getch();}
содержание файла save такое
2 7 2222 3
8 24 211
1 4
Он считывает и выводи все по строчно, а можно чуть листинг программы изменить так чтоб он допустим в каждой строке считывал только первый символ ну в данном случае 2 8 1 , или допустим по два символа и так далее?
0
Эксперт С++
 Аватар для Nameless One
5828 / 3479 / 358
Регистрация: 08.02.2010
Сообщений: 7,448
14.10.2011, 15:11
С помощью scanf можно, если я правильно понял, что тебе нужно
0
11 / 11 / 6
Регистрация: 03.04.2011
Сообщений: 631
14.10.2011, 15:11  [ТС]
а как можите накидать?
0
11 / 11 / 6
Регистрация: 03.04.2011
Сообщений: 631
14.10.2011, 15:46  [ТС]
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
#include <iostream>
#include <conio.h>
#include <stdio.h>
using namespace std;
main()
{
char filename[] = {"save.txt"};
FILE *fp;
char temp[100];
fp = fopen(filename, "r");
while (fgets(temp, 100, fp) != NULL)
cout << temp;
fclose(fp);
getch();}
Он считывает и выводи все по строчно, а можно чуть листинг программы изменить так чтоб он допустим в каждой строке считывал только первый символ ну в данном случае 2 8 1 , или допустим по два символа и так далее? покажите примерно как? я думал что 100 это количество символов которое читается в каждой строке, изменял на два но так же выводит всю длинну строк, а не только первые 2 символа в каждой строке
0
71 / 76 / 9
Регистрация: 30.06.2011
Сообщений: 176
14.10.2011, 15:58
C++
1
cout << temp[0]; // Вывод первого символа в строке
Для остальных символов так же.
Тут еще важно использовать strlen(...) проверять длину строки, чтобы знать сколько всего символов в строке.
0
11 / 11 / 6
Регистрация: 03.04.2011
Сообщений: 631
14.10.2011, 16:07  [ТС]
Цитата Сообщение от An1ka Посмотреть сообщение
cout << temp[0]; // Вывод первого символа в строке
ну это получается вывод первых, а как сделать чтоб было именно считывание только первых а вывод оставить не тронутым?
0
290 / 193 / 23
Регистрация: 03.08.2011
Сообщений: 2,824
Записей в блоге: 12
14.10.2011, 16:59
ну если память не изменяет то fgetc

Добавлено через 1 минуту
а потом надо определить длину строки и прибавить это число к указателю чтения
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
14.10.2011, 16:59
Помогаю со студенческими работами здесь

Как использовать функцию?
Помогите, плз. Беда с функциями, не совсем понимаю как их вызывать. Вот запилил я, например, прогу, которая задает рандомный массив и юзает...

Как использовать функцию
Как использовать функцию, у которой тип возвращаемого значения: a. Void b. Не void (любой другой тип, например QString)

Как использовать функцию НОРМСТРАСП
как эту функцию записать в с++ ??

Как использовать функцию flush()?
для проверки правильности вводимых данных использую такой код #include &lt;stdio.h&gt;; #include &lt;iostream&gt;; using namespace std;...

Как использовать функцию getline
есть программа структура о книгах, с поиском по дате из-за функции cin можно ввести только одно слово так как после пробела cin не...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Реализация движения на Box2D v3 - трение и коллизии с повёрнутыми стенами
8Observer8 20.02.2026
Содержание блога Box2D позволяет легко создать главного героя, который не проходит сквозь стены и перемещается с заданным трением о препятствия, которые можно располагать под углом, как верхнее. . .
Конвертировать закладки radiotray-ng в m3u-плейлист
damix 19.02.2026
Это можно сделать скриптом для PowerShell. Использование . \СonvertRadiotrayToM3U. ps1 <path_to_bookmarks. json> Рядом с файлом bookmarks. json появится файл bookmarks. m3u с результатом. # Check if. . .
Семь CDC на одном интерфейсе: 5 U[S]ARTов, 1 CAN и 1 SSI
Eddy_Em 18.02.2026
Постепенно допиливаю свою "многоинтерфейсную плату". Выглядит вот так: https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11617&stc=1&d=1771445347 Основана на STM32F303RBT6. На борту пять. . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила» «Время-Деньги» «Деньги -Пуля»
SDL3 для Web (WebAssembly): Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 12.02.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами и вызывать обработчики событий столкновения. . . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru