2

小さなソケット プログラム (GNU libc) を作成しています。ユーザーに入力を求めるループがあります (例: "MSG>")。ユーザーが Enter キーを押すと、メッセージが送信されます (現在は localhost のサーバーに送信されます)。

とにかく、stdin から char バッファ [256] に読み込みたい。私は現在、私が望むことをしない fgets() を使用しています。256バイトのいくつかの文字列を介して1000バイトのc文字列を送信できるように、ユーザーに尋ねてから一度に256 -1バイトのデータを取得するようにコードを書く方法がわかりません。

編集:コードを追加

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#define BUFSIZE 256

int main(int argc, char *argv[])
{
  char msg[BUFSIZE];
  size_t msgLen;

  msgLen = strlen(fgets(msg, BUFSIZE, stdin));
  puts(msg);

  // This simply checks whether we managed to fill the buffer and tries to get
  // more input
  while (msgLen == (BUFSIZE - 1))
    {
      memset (msg, '\0', BUFSIZE);
      fread(msg, BUFSIZE, 1, stdin);
      msg[BUFSIZE - 1] = '\0';
      msgLen = strlen(msg);
      puts(msg);
      if (msgLen < (BUFSIZE - 1))
    break;
    }

  return 0;
}
4

4 に答える 4

2

1000 バイトが確実に受信されるようにループを実装していますね。読みやすくするために、ループは 1000 までカウントしていることを示す必要があります。(+= 演算子を使用して) 読み取ったバイト数を追跡​​し、その数をループ条件で使用します。

255 バイトを読み取ると想定しているようですfreadが、これは 255 バイトが使用可能であるという無効な仮定の下にあります。255 バイト未満が読み取られた場合、これは必ずしもエラーを示しているわけではありません。読み続けます!の戻り値がfread0 未満の場合は、心配する必要があります。それらの状況に対処するようにしてください。

于 2013-01-28T02:11:22.787 に答える
1

これはどう:

fread(buffer, sizeof(buffer), 1, stdin);
于 2013-01-28T00:29:36.623 に答える
1

を使用している場合fgets()は、標準 IO ライブラリを使用しています。fread()then (たとえば、ファイル記述子を使用する の代わりにread()) を使用して、読み取るバイト数を指定します。参照: http://www.cplusplus.com/reference/cstdio/fread/

于 2013-01-28T00:30:33.003 に答える
1

readバッファリングされた入力に関数を使用することを検討してください。開いているファイル記述子 (stdin の場合は STDIN_FILENO)、バッファーへのポインター ( char *)、および読み取るバイト数を受け取ります。詳細については、マニュアルのエントリを参照してください。

于 2013-01-28T00:25:53.583 に答える