【问题标题】:read() function not allowing anything to be printed after newline characterread() 函数不允许在换行符后打印任何内容
【发布时间】:2014-02-02 00:30:22
【问题描述】:

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

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);

在获得更多数据之前,它拒绝打印“>”符号。

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

我可能应该补充一点,对该函数的调用如下所示:

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

【问题讨论】:

  • 可能是 printf("Server Message: %s\n>", buffer) 引号内带有&gt; 符号?
  • 如果这就是你的意思,那么 > 在引号内。
  • 更正了问题

标签: c linux printf newline


【解决方案1】:

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

【讨论】:

  • 我认为stderr 没有被缓冲。
【解决方案2】:

nOfBytes = 读取(文件描述符,缓冲区,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);
    }

【讨论】:

  • 空字符不是告诉读取函数停止读取吗?我会把这个命令放在哪里?
  • 没有。您正在阅读一个流,read 可以返回任意数量的字符,最多可以达到您请求的数量。它将这些字节放入缓冲区。如果您读取的字节数之后的缓冲区中的字符为空,那将是幸运的,因此为您创建了一个正确的 C 字符串 fprint。请注意,在这种情况下,您 需要这样做,因为您正在尝试将每个读取作为字符串打印到缓冲区中。
【解决方案3】:

printf 使用标准输出,它是一个缓冲输出。
printf 更改为fprintf(stderr, ...) 应该可以解决您的问题。

【讨论】:

  • 你也可以在标准输出中使用fflush(stdout); 甚至fflush(0);
猜你喜欢
  • 1970-01-01
  • 2023-03-06
  • 2019-05-26
  • 2021-02-13
  • 1970-01-01
  • 2020-07-23
  • 2022-01-09
  • 2017-06-20
  • 1970-01-01
相关资源
最近更新 更多