Разница между read () и fgets () в C - PullRequest
9 голосов
/ 03 июня 2011

Я хочу читать из потока stdin.Есть ли разница в использовании read () или fgets () для чтения из потока stdin.

Я прилагаю следующие два фрагмента кода с помощью fgets и read.С fgets я могу использовать Java-программу, чтобы легко писать и читать из c-программы.При чтении и записи моя java-программа зависает в ожидании вывода программы C, которая не приходит.

Я просто читаю строку, сохраняя ее в buf и добавляя к ней A.

Java-программа может общаться со следующей программой, которая работает с fgets и put.

#include <stdio.h>
#include <string.h>
#define SIZE  200000
main()
{
int rc;
int df;
int i;
char buf[SIZE];
for(i=0;i<=120000;i++) {
      memset(buf,'\0',SIZE);
      if(!fgets(buf,SIZE-1,stdin))
        continue;
      strcat(buf,"A_A_A_A_A_A_A");
      puts(buf);
}

}

, но не с read () и write ()

main()
{
int rc;
int df;
int i;
char buf[32768];
rc = fcntl(fileno(stdin), F_SETFL, O_NONBLOCK);
//rc = fcntl(fileno(stdout), F_SETFL, O_NONBLOCK);
FILE *fp;
for (;;) 
{
    int rc=-1;
    memset(buf,'\0',32768);
    //rc = fread(buf,5, 1, stdin);
    rc = read(fileno(stdin),buf,32768); 
    if (rc > 0)
    {
        strcat(buf,"B_B_B_B_B_B_B_B_B");
        write(fileno(stdout),buf,strlen(buf));

    }
}

}

Может кто-нибудь сказать причину.Мне все еще трудно понять,

Ответы [ 5 ]

22 голосов
/ 03 июня 2011
  • fgets - это функция, read - системный вызов
  • fgets является стандартным C, read не является
  • fgets буферизовано stdio, read не
  • fgets работает с FILE *, read работает с файловым дескриптором
  • fgets читает до новой строки, read читает, как много вы говорите

Нужно больше?

6 голосов
/ 03 июня 2011

Существует важная альтернатива (fread), которая находится несколько посередине, поэтому вопрос должен быть действительно разбит на две части - и на обе они уже есть хорошие ответы в SO:

В чем разницамежду fread и read?

В чем разница между fgets и fread?

Быстрое эмпирическое правило: используйте fgets, если вы хотите читать текстовые данные построчно, используйте fread в другом месте.

2 голосов
/ 03 июня 2011
#include <stdio.h>
char    fgets (char * restrict str, int size, FILE * restrict stream)

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

Ссылка: fgets ()

#include <unistd.h>
ssize_t pread(int fildes, void *buf, size_t nbyte, off_t offset);

Функция read () должна пытаться считывать n-байтовые байты из файла, связанного с дескриптором открытого файла, fildes, в буфер, на который указывает buf.Поведение нескольких одновременных операций чтения на одном канале, FIFO или терминальном устройстве не определено.

Ссылка: read ()

0 голосов
/ 03 июня 2011

Эти две функции не имеют ничего общего.read - это системный вызов POSIX, который читает из дескриптора файла.fgets - это функция библиотеки C, которая читает из ФАЙЛА *.

0 голосов
/ 03 июня 2011

Один (read) пытается прочитать указанное количество байтов, а другой (fgets) пытается прочитать одну строку и остановится на новой строке.

...