read()函数不允许在换行符之后打印任何内容

时间:2014-02-02 00:30:22

标签: c linux printf newline

我有一个从服务器读取文件并返回数据的函数:

int readMessageFromServer(int fileDescriptor) {
  char buffer[MAXMSG];
  int nOfBytes;

  nOfBytes = read(fileDescriptor, buffer, MAXMSG);
  if(nOfBytes < 0) {
    perror("Could not read data from server\n");
    exit(EXIT_FAILURE);
  }
  else
    if(nOfBytes == 0) 
      return(-1);
    else 
      printf("Server Message: %s\n",  buffer);
  return(0);
}

问题在于

printf("Server Message: %s\n",  buffer);

如果我将此行更改为

printf("Server Message: %s\n>",  buffer);

它拒绝打印'&gt;'签名,直到获得更多数据。

这是一个已知的限制还是我做错了什么?

我应该补充说,对此函数的调用如下所示:

while(readMessageFromServer(sock) > 0) {continue;};

3 个答案:

答案 0 :(得分:2)

除了您可能想在引号内写>之外,您还需要通过调用fflush(stdout)来刷新输出缓冲区。缓冲区通常只在换行后刷新。

答案 1 :(得分:1)

  

nOfBytes = read(fileDescriptor,buffer,MAXMSG);

无法保证您读取了多少字节或它们是否构成空终止字符串。至少你应该改成这样的东西:

int readMessageFromServer(int fileDescriptor) {
  char buffer[MAXMSG];
  int nOfBytes;

  nOfBytes = read(fileDescriptor, buffer, MAXMSG - 1);
  if(nOfBytes < 0) {
    perror("Could not read data from server\n");
    exit(EXIT_FAILURE);
  }
  else
    if(nOfBytes == 0) 
      return(-1);
    else 
    {
      buffer[nOfBytes] = '\0';
      printf("Server Message: %s\n",  buffer);
      return(0);
    }

答案 2 :(得分:0)

printf使用stdout作为缓冲输出 使用printf更改fprintf(stderr, ...)可以解决您的问题。