C - 一次从stdin BUFSIZE字符读取

时间:2013-01-28 00:22:24

标签: c++ c linux sockets unix

我正在编写一个小套接字程序(GNU libc)。我有一个循环,要求用户输入(例如" MSG>")。当用户按Enter键时,将发送消息(当前发送到localhost上的服务器)。

无论如何,我想从stdin读入char缓冲区[256]。我目前正在使用fgets(),它没有做我想做的事情。我不确定如何编写代码,以便我询问用户,然后一次获取256个字节的数据,这样我就可以通过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 个答案:

答案 0 :(得分:2)

您正在实现一个循环以确保收到1000个字节,对吗?为了易读性,循环应该表明它计数到1000。跟踪您读取的字节数(使用+ =运算符),并在循环条件中使用该数字。

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

答案 1 :(得分:1)

您可以考虑将read函数用于缓冲输入。它需要一个打开的文件描述符(stdin的STDIN_FILENO),一个指向缓冲区(char *)的指针和要读取的字节数。有关详细信息,请参阅手册entry

答案 2 :(得分:1)

这个怎么样:

fread(buffer, sizeof(buffer), 1, stdin);

答案 3 :(得分:1)

如果您正在使用fgets(),那么您正在使用标准IO库。您将要使用fread()然后(而不是使用文件描述符的read())来指定要读取的字节数。请参阅:http://www.cplusplus.com/reference/cstdio/fread/