2

我正在编写一个小型套接字程序(GNU libc)。我有一个循环询问用户输入(例如“MSG>”)。当用户按下回车键时,消息被发送(当前发送到 localhost 上的服务器)。

无论如何,我想从标准输入读入一个字符缓冲区[256]。我目前使用的 fgets() 不能满足我的要求。我不确定如何编写代码,以便我询问用户然后一次获取 256 -1 个字节的数据,以便我可以通过几个 256 字节的字符串发送一个 1000 字节的 c 字符串。

编辑:添加代码

#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。跟踪您读取的字节数(使用 += 运算符),并在循环条件中使用该数字。

您似乎假设fread将读取 255 个字节,但这是在 255 个字节可用的无效假设下。当读取的字节数少于 255 时,这并不一定表示错误;继续阅读!当 的返回值fread小于零时,您应该担心。确保你处理这些情况。

于 2013-01-28T02:11:22.787 回答
1

您可以考虑使用该read函数进行缓冲输入。它需要一个打开的文件描述符(标准输入为 STDIN_FILENO)、一个指向缓冲区的指针(char *)和要读取的字节数。有关详细信息,请参阅手册条目。

于 2013-01-28T00:25:53.583 回答
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 回答