1. ホーム
  2. c++

[解決済み] C - 標準入力から BUFSIZE 文字を一度に読み込む

2022-02-08 06:08:20

質問内容

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

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

EDIT: コードを追加

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

解決方法は?

1000バイトを確実に受信するためのループを実装していますよね?ループは見やすくするために、1000までカウントしていることを示すべきです。読み取ったバイト数を記録し(+=演算子を使用)、その数をループの条件に使用します。

を想定しているようですが fread は255バイトを読み込みますが、これは255バイトが利用可能であるという無効な前提のもとでの話です。255バイトに満たない場合は、必ずしもエラーにはなりませんので、そのまま読み進めてください。の戻り値が fread が0より小さい場合は、心配する必要があります。そのような状況に対応できるようにしましょう。