首页 > 解决方案 > sprintf 没有正确填充缓冲区

问题描述

我正在使用write在每一行创建一个具有以下类型值的 csv 文件

int16_t, int16_t, int16_t, int64_t, uint64_t

首先使用 sprintf 填充缓冲区并将其传递给 write。但是,写入文件中的所有值只有一行。没有新线。

static char line[34];



sprintf(line, "%d,%d,%d,%ld,%lu\n", ...);

write(fd_csv_data, line, sizeof(line));

%d,%d,%d,%ld,%lu 总共产生 32 个字节,加上 \n 和 \0 结果为 34。我做错了什么?

标签: clinuxfileprintf

解决方案


两个问题:

  1. 您编写完整的缓冲区,甚至是空终止符之后的部分。这部分可能未初始化并且具有不确定的值。
  2. 即使你完全填满了缓冲区,你也要写空终止符,它不应该被写入文本文件。

要解决这两个问题,请改用strlen获取字符串的实际长度:

write(fd_csv_data, line, strlen(line));

另外几点说明:

  • 使用snprintf代替sprintf, 以避免可能的缓冲区溢出
  • l64 位类型的大小前缀可能是错误的,请使用标准格式的宏常量,例如PRId64for int64_t

推荐阅读