c - 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。我做错了什么?
解决方案
两个问题:
- 您编写完整的缓冲区,甚至是空终止符之后的部分。这部分可能未初始化并且具有不确定的值。
- 即使你完全填满了缓冲区,你也要写空终止符,它不应该被写入文本文件。
要解决这两个问题,请改用strlen
获取字符串的实际长度:
write(fd_csv_data, line, strlen(line));
另外几点说明:
- 使用
snprintf
代替sprintf
, 以避免可能的缓冲区溢出 l
64 位类型的大小前缀可能是错误的,请使用标准格式的宏常量,例如PRId64
forint64_t
。