6

我正在尝试编写一个客户端可以用来浏览服务器目录的 TCP 服务器。除此之外,如果这是一个常规文件,我想发送目录的大小。文件的大小保存在“stat”结构下的 size_t 变量中。我在这里这样做:

char *fullName  /* The path to the file *.
/** 
  * Some code here
  */
struct stat buffer;
lstat(fullName, &buffer)

所以现在 buffer.st_size 包含文件的大小。现在我想将它 write() 到监听套接字,但显然我必须以某种方式将它转换为字符串。我知道这可以通过按位右移 (>>) 运算符以某种方式完成,但这对我来说似乎太痛苦了。你能帮帮我吗(即使除了按位运算符之外别无他法)?

顺便说一句,这不是学校或smth...

PS:我在 Linux 上运行它。

4

3 回答 3

13

您可以使用sprintf()-family函数的成员将“某物”转换为“字符串”。

#define _POSIX_C_SOURCE 200112L

#include <stdio.h>
#include <unistd.h>   
#include <string.h>

int main(void)
{
  size_t s = 123456789;
  char str[256] = ""; /* In fact not necessary as snprintf() adds the 
                         0-terminator. */

  snprintf(str, sizeof str, "%zu", s);

  fputs(stdout, "The size is '");
  fflush(stdout);

  write(fileno(stdout), str, strlen(str));

  fputs(stdout, "'.\n");

  return 0;
}

打印出来:

The size is '123456789'.
于 2013-12-19T15:11:34.933 回答
3

你知道那size_t是无符号的,但长度是未知的。在 C99 中,我们有z修饰符,使完整的说明符%zu

size_t s = 123456789;
char str[256];

snprintf(str, sizeof str, "%zu", s);
于 2013-12-19T15:16:02.493 回答
1

char *不一定是字符串,你可以发送你想要的。只需管理另一台计算机使用相同的协议即可。

所以你可以这样做:

write(socket, &(buffer.st_size), sizeof(size_t));

这可能太快了,您可能必须考虑字节序等。

于 2013-12-19T15:15:09.417 回答