Форум программистов, компьютерный форум CyberForum.ru
Наши страницы

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 133, средняя оценка - 4.83
lexflax
10 / 10 / 1
Регистрация: 03.04.2011
Сообщений: 627
#1

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

12.10.2011, 15:53. Просмотров 18335. Ответов 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
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
12.10.2011, 15:53
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Как использовать функцию fgets? (C++):

Как использовать getline и fgets? - C++
#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? - C++
while (fgets(s1, sz_line, fp)) //будет прочитано 120 символов { // считаем длину текущей строки , будет в j j = 0; while...

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

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

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

Как использовать функцию Kbhit()? - C++
Как я понял, то функция kbhit() сохраняет значение нажатой клавиши в буфере. Подскажите, как получить это значение из буфера. Мне...

26
Nameless One
Эксперт С++
5774 / 3424 / 255
Регистрация: 08.02.2010
Сообщений: 7,447
12.10.2011, 16:22 #2
Цитата Сообщение от lexflax Посмотреть сообщение
что за входной поток?
объект типа FILE* - обычно либо stdin, либо открытий на чтение функцией fopen файл
Цитата Сообщение от lexflax Посмотреть сообщение
как понять не более num-1 символов?
в прямом смысле, если в данном случае доступно для чтения больше чем num-1 байт, то читается num - 1 байт, затем в массив записывается символ '\0', а остальной ввод игнорируется
1
Van111
209 / 188 / 4
Регистрация: 03.08.2011
Сообщений: 2,597
Записей в блоге: 12
12.10.2011, 16:37 #3
printf("%s", str);// ну тут вывод стоки только что значит "%S"
%s значит что будет выводится строка то есть последовательность символо пока не встреатится символ с кодом ноль который обозначает конец файла

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

Если же у тебя есть файл:
Код
a very long line
another line
и
C
1
2
char buf[5];
fgets(buf, 5, file);
то после чтения из файла ты получишь buf = "a ve"
0
lexflax
10 / 10 / 1
Регистрация: 03.04.2011
Сообщений: 627
12.10.2011, 17:12  [ТС] #6
ну допустим у меня в первой строке 150 символом то в том листенге что выше не правильно будет, он не сможет все считать потому что там максимум 128 символов забито так? и второй вопрос допустим мне надо считать 3 строки из файла разной длинны какой код подойдет для этого можите написать ?
0
Van111
209 / 188 / 4
Регистрация: 03.08.2011
Сообщений: 2,597
Записей в блоге: 12
12.10.2011, 17:13 #7
Если у тебя размер буфера заведомо больше, чем размер одной строки, то за один вызов fgets из файла прочитается ровно одна строка

а если буфер меньше то следующее чтение будет со следующея строки?
0
Nameless One
Эксперт С++
5774 / 3424 / 255
Регистрация: 08.02.2010
Сообщений: 7,447
12.10.2011, 17:17 #8
Цитата Сообщение от Van111 Посмотреть сообщение
а если буфер меньше то следующее чтение будет со следующея строки?
если буфер меньше, то следующее чтение будет с того места, где закончилось предыдущее чтение.
1
Nameless One
Эксперт С++
5774 / 3424 / 255
Регистрация: 08.02.2010
Сообщений: 7,447
12.10.2011, 17:27 #9
Цитата Сообщение от 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);
}
А вот само чтение:
Код
[nameless@laptop c]$ echo input from stdin | ./sample 
input from stdin
[nameless@laptop c]
2
lexflax
10 / 10 / 1
Регистрация: 03.04.2011
Сообщений: 627
13.10.2011, 14:31  [ТС] #10
вот такое накидал как понял но не работает посмотрите плиз, хотел чтоб из файла с именем сайв считывалось все в переменную 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
Эксперт С++
5774 / 3424 / 255
Регистрация: 08.02.2010
Сообщений: 7,447
13.10.2011, 16:02 #11
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
lexflax
10 / 10 / 1
Регистрация: 03.04.2011
Сообщений: 627
14.10.2011, 14:22  [ТС] #12
Цитата Сообщение от Nameless One Посмотреть сообщение
EXIT_SUCCESS;
эта строчка что означает?

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

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

goto ret - переход на метку ret
1
lexflax
10 / 10 / 1
Регистрация: 03.04.2011
Сообщений: 627
14.10.2011, 15:02  [ТС] #14
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
Эксперт С++
5774 / 3424 / 255
Регистрация: 08.02.2010
Сообщений: 7,447
14.10.2011, 15:11 #15
С помощью scanf можно, если я правильно понял, что тебе нужно
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
14.10.2011, 15:11
Привет! Вот еще темы с ответами:

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

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

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

Как использовать консольную функцию GetCurrentConsoleFont ? - C++
Доброго времени всем! У меня Visual C++ 6.0 и ОС -XP Пож. Помогите разобраться с использованием консольной функции API ...


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

Или воспользуйтесь поиском по форуму:
15
Yandex
Объявления
14.10.2011, 15:11
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru