4

我有一个需要打印到文件的 MPI 进程。MPI 系统使用像 MPI_File_iwrite 这样的功能命令,它接受一个缓冲区(例如一个字符指针)和一个整数长度。然后,缓冲区被打印到文件中。

因此,为了打印我需要打印到文件的内容,我需要以某种方式将 printf 函数替换为将格式转换映射到 char * 缓冲区的函数。这是有问题的,因为字符串的长度可能会有所不同......例如:

printf("something %d, %d, %d, %f, etc.",x,y,z,p,d,...);

如何恢复 printf 格式化产生的字符串,找出长度,并将其作为 char * 传递给 mpi 函数?

4

3 回答 3

7

看起来您想使用snprintf足够大的缓冲区。

如果缓冲区足够大,则返回值snprintf等于打印的字符数。您可以将输出字符串的长度计算为缓冲区大小和返回值的最小值snprintf

于 2016-12-04T01:27:23.273 回答
5

您可以将 0 字节“打印”到NULL带有snprintf(). 在这种情况下,不会写入任何字符串,但snprintf()其返回值仍会正常运行。然后你可以分配一个足够大的缓冲区。

例如:

size_t len;
len = snprintf(NULL, 0, "something %d, %d, %d, %f, etc.",x,y,z,p,d,...);
if (len > 0) {
    char *buf = malloc(len + 1);
    snprintf(buf, len + 1, "something %d, %d, %d, %f, etc.",x,y,z,p,d,...);
}

这仅在 C99 及更高版本中有效。

请注意,snprintf()如果存在转换错误,它可以返回负值。这只是可能发生这种情况的少数情况,但它们仍然存在。根据说明符,其输出也可能为零。

于 2016-12-04T01:53:12.027 回答
3

根据您的问题,我认为答案是使用sprintf()snprintf()而不是printf()-sprintf()输出到缓冲区并返回写入的字符数,而无需检查传递的缓冲区是否足够大。snprintf()接受一个附加参数,指定要写入的最大字节数(这是更安全的方法)。

char my_buf[MAX_LENGTH];
int bytes_written;

// using snprintf
bytes_written = snprintf(my_buf, MAX_LENGTH, "%d %d ...", arg0, arg1 ...);

请注意,sprintf()和变体还需要一个额外的终止符字节,\0因此这应该反映在您定义的缓冲区大小中。返回值(写入的字节数)不包括终止符。

于 2016-12-04T01:30:23.607 回答