11

stdinストリームから読みたい。read()またはfgets()を使用してstdinストリームから読み取ることに違いはありますか?

次の2つのコードをfgetsで添付して読み取ります。fgetsを使用すると、Javaプログラムを使用して、Cプログラムの書き込みと読み取りを簡単に行うことができます。読み取りと書き込みを行うと、Javaプログラムがハングし、Cプログラムからの出力が来ないのを待ちます。

私はそれをbufに保持し、それにAを追加する行を読んでいます。

Javaプログラムは、fgetsおよびputsで動作する次のプログラムと通信できます。

#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));

    }
}

}

誰かが理由を教えてもらえますか。私はまだ理解するのが難しいと感じています

4

5 に答える 5

31
  • fgets関数でreadあり、システムコールです
  • fgets標準Cですが、そうでreadはありません
  • fgetsstdioはバッファリングされていますが、そうでreadはありません
  • fgetsFILE *で動作readし、ファイル記述子で動作します
  • fgets改行まで読み取り、read指示した量を読み取ります

もっといります ?

于 2011-06-02T20:37:33.097 に答える
8

やや真ん中に位置する重要な代替案(fread)があるので、質問は実際には2つの部分に分割する必要があります-そして両方ともSOですでによく答えられています:

freadreadの違いは何ですか?

fgetsfreadの違いは何ですか?

簡単な経験則:fgetsテキストデータを1行ずつ読み取る場合は、他の場所で使用しfreadます。

于 2011-06-02T20:41:10.817 に答える
2
#include <stdio.h>
char    fgets (char * restrict str, int size, FILE * restrict stream)

fgets()関数は、指定されたストリームから size で指定された文字数より最大で 1 つ少ない文字数を読み取り、文字列 str に格納します。改行文字が見つかった場合、ファイルの終わりまたはエラーで読み取りが停止します。

参照: fgets()

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

read()関数は、開いているファイル記述子 fildes に関連付けられたファイルから buf が指すバッファーに nbyte バイトを読み取ろうとします。同じパイプ、FIFO、または端末デバイスでの複数の同時読み取りの動作は規定されていません。

参照: read()

于 2011-06-02T20:44:51.673 に答える
0

2つの機能に共通点はありません。readは、ファイルハンドルから読み取るPOSIXシステムコールです。fgetsは、FILE*から読み取るCライブラリ関数です。

于 2011-06-02T20:40:52.987 に答える
0

1 つ ( read) は指定されたバイト数の読み取りを試みますが、もう 1 つの ( fgets) は 1 行の読み取りを試み、改行で停止します。

于 2011-06-02T20:38:03.750 に答える