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

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

Восстановить пароль Регистрация
 
 
Рейтинг: Рейтинг темы: голосов - 133, средняя оценка - 4.83
lexflax
10 / 10 / 1
Регистрация: 03.04.2011
Сообщений: 627
12.10.2011, 15:53     Как использовать функцию fgets? #1
Люди прочитал тут про функцию 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;
}
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
12.10.2011, 15:53     Как использовать функцию fgets?
Посмотрите здесь:

Как использовать функцию flush()? C++
как использовать getline и fgets? C++
Как в C++ использовать функцию inc(); ? C++
Не понимаю как использовать функцию getchar() C++
Как использовать функцию? C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Nameless One
Эксперт С++
 Аватар для Nameless One
5755 / 3404 / 255
Регистрация: 08.02.2010
Сообщений: 7,393
12.10.2011, 16:22     Как использовать функцию fgets? #2
Цитата Сообщение от lexflax Посмотреть сообщение
что за входной поток?
объект типа FILE* - обычно либо stdin, либо открытий на чтение функцией fopen файл
Цитата Сообщение от lexflax Посмотреть сообщение
как понять не более num-1 символов?
в прямом смысле, если в данном случае доступно для чтения больше чем num-1 байт, то читается num - 1 байт, затем в массив записывается символ '\0', а остальной ввод игнорируется
Van111
кодер с++
208 / 187 / 4
Регистрация: 03.08.2011
Сообщений: 2,585
Записей в блоге: 12
12.10.2011, 16:37     Как использовать функцию fgets? #3
printf("%s", str);// ну тут вывод стоки только что значит "%S"
%s значит что будет выводится строка то есть последовательность символо пока не встреатится символ с кодом ноль который обозначает конец файла

Добавлено через 4 минуты
fgets(str, 126, fp) будет прочитано 126 символов (размер переменнй для записи строки 127 символов последний 127 str[126] используется для вставки символа с кодом ноль) если программа встретит в файле символ с кодом \n раньше чем считает 126 символов то считывание закончится
lexflax
10 / 10 / 1
Регистрация: 03.04.2011
Сообщений: 627
12.10.2011, 17:00  [ТС]     Как использовать функцию fgets? #4
а если в файле допустим 3 три строки и всего 280 символов тогда как будет обработка происходить?
Nameless One
Эксперт С++
 Аватар для Nameless One
5755 / 3404 / 255
Регистрация: 08.02.2010
Сообщений: 7,393
12.10.2011, 17:07     Как использовать функцию fgets? #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"
lexflax
10 / 10 / 1
Регистрация: 03.04.2011
Сообщений: 627
12.10.2011, 17:12  [ТС]     Как использовать функцию fgets? #6
ну допустим у меня в первой строке 150 символом то в том листенге что выше не правильно будет, он не сможет все считать потому что там максимум 128 символов забито так? и второй вопрос допустим мне надо считать 3 строки из файла разной длинны какой код подойдет для этого можите написать ?
Van111
кодер с++
208 / 187 / 4
Регистрация: 03.08.2011
Сообщений: 2,585
Записей в блоге: 12
12.10.2011, 17:13     Как использовать функцию fgets? #7
Если у тебя размер буфера заведомо больше, чем размер одной строки, то за один вызов fgets из файла прочитается ровно одна строка

а если буфер меньше то следующее чтение будет со следующея строки?
Nameless One
Эксперт С++
 Аватар для Nameless One
5755 / 3404 / 255
Регистрация: 08.02.2010
Сообщений: 7,393
12.10.2011, 17:17     Как использовать функцию fgets? #8
Цитата Сообщение от Van111 Посмотреть сообщение
а если буфер меньше то следующее чтение будет со следующея строки?
если буфер меньше, то следующее чтение будет с того места, где закончилось предыдущее чтение.
Nameless One
Эксперт С++
 Аватар для Nameless One
5755 / 3404 / 255
Регистрация: 08.02.2010
Сообщений: 7,393
12.10.2011, 17:27     Как использовать функцию fgets? #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]
lexflax
10 / 10 / 1
Регистрация: 03.04.2011
Сообщений: 627
13.10.2011, 14:31  [ТС]     Как использовать функцию fgets? #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();}
}
Nameless One
Эксперт С++
 Аватар для Nameless One
5755 / 3404 / 255
Регистрация: 08.02.2010
Сообщений: 7,393
13.10.2011, 16:02     Как использовать функцию fgets? #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);
}
lexflax
10 / 10 / 1
Регистрация: 03.04.2011
Сообщений: 627
14.10.2011, 14:22  [ТС]     Как использовать функцию fgets? #12
Цитата Сообщение от Nameless One Посмотреть сообщение
EXIT_SUCCESS;
эта строчка что означает?

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

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

goto ret - переход на метку ret
lexflax
10 / 10 / 1
Регистрация: 03.04.2011
Сообщений: 627
14.10.2011, 15:02  [ТС]     Как использовать функцию fgets? #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 , или допустим по два символа и так далее?
Nameless One
Эксперт С++
 Аватар для Nameless One
5755 / 3404 / 255
Регистрация: 08.02.2010
Сообщений: 7,393
14.10.2011, 15:11     Как использовать функцию fgets? #15
С помощью scanf можно, если я правильно понял, что тебе нужно
lexflax
10 / 10 / 1
Регистрация: 03.04.2011
Сообщений: 627
14.10.2011, 15:11  [ТС]     Как использовать функцию fgets? #16
а как можите накидать?
lexflax
10 / 10 / 1
Регистрация: 03.04.2011
Сообщений: 627
14.10.2011, 15:46  [ТС]     Как использовать функцию fgets? #17
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 символа в каждой строке
An1ka
65 / 70 / 2
Регистрация: 30.06.2011
Сообщений: 176
14.10.2011, 15:58     Как использовать функцию fgets? #18
C++
1
cout << temp[0]; // Вывод первого символа в строке
Для остальных символов так же.
Тут еще важно использовать strlen(...) проверять длину строки, чтобы знать сколько всего символов в строке.
lexflax
10 / 10 / 1
Регистрация: 03.04.2011
Сообщений: 627
14.10.2011, 16:07  [ТС]     Как использовать функцию fgets? #19
Цитата Сообщение от An1ka Посмотреть сообщение
cout << temp[0]; // Вывод первого символа в строке
ну это получается вывод первых, а как сделать чтоб было именно считывание только первых а вывод оставить не тронутым?
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
14.10.2011, 16:59     Как использовать функцию fgets?
Еще ссылки по теме:

C++ Как использовать функцию Kbhit()?
C++ Как использовать функцию НОРМСТРАСП
C++ Указатели на функцию - как их использовать, как объявлять

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

Или воспользуйтесь поиском по форуму:
Van111
кодер с++
208 / 187 / 4
Регистрация: 03.08.2011
Сообщений: 2,585
Записей в блоге: 12
14.10.2011, 16:59     Как использовать функцию fgets? #20
ну если память не изменяет то fgetc

Добавлено через 1 минуту
а потом надо определить длину строки и прибавить это число к указателю чтения
Yandex
Объявления
14.10.2011, 16:59     Как использовать функцию fgets?
Ответ Создать тему
Опции темы

Текущее время: 10:43. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru