Струнный поток в C - PullRequest
       21

Струнный поток в C

12 голосов
/ 14 августа 2010
print2fp(const void *buffer, size_t size, FILE *stream) {

 if(fwrite(buffer, 1, size, stream) != size)
  return -1;

 return 0;
}

Как записать данные в поток строк вместо потока файлов?

Ответы [ 2 ]

10 голосов
/ 15 июня 2013

В стандарте posix 2008 очень удобная функция: open_memstream (). Вы используете это так:

char* buffer = NULL;
size_t bufferSize = 0;
FILE* myStream = open_memstream(&buffer, &bufferSize);

fprintf(myStream, "You can output anything to myStream, just as you can with stdout.\n");
myComplexPrintFunction(myStream);    //Append something of completely unknown size.

fclose(myStream);    //This will set buffer and bufferSize.
printf("I can do anything with the resulting string now. It is: \"%s\"\n", buffer);
free(buffer);
3 голосов
/ 06 мая 2013

Использование sprintf: http://www.cplusplus.com/reference/cstdio/sprintf/

Вот пример из справочника:

#include <stdio.h>

int main ()
{
  char buffer [50];
  int n, a=5, b=3;
  n = sprintf(buffer, "%d plus %d is %d", a, b, a+b);
  printf("[%s] is a string %d chars long\n", buffer, n);
  return 0;
}

Выход:

[5 plus 3 is 8] is a string 13 chars long

Обновление на основе рекомендаций в комментариях:

Используйте snprintf, поскольку он более безопасен (он предотвращает атаки переполнения буфера) и более переносим.

#include <stdio.h>

int main ()
{
  int sizeOfBuffer = 50;
  char buffer[sizeOfBuffer];
  int n, a = 5, b = 3;
  n = snprintf(buffer, sizeOfBuffer, "%d plus %d is %d", a, b, a+b);
  printf ("[%s] is a string %d chars long\n", buffer, n);
  return 0;
}

Обратите внимание, что второй аргумент snprintf на самом деле является максимально допустимым размером, который можно использовать, поэтому вы можете установить для него более низкое значение, чем sizeOfBuffer, однако для вашего случая это будет не нужно. snprintf записывает только sizeOfBuffer-1 символов и использует последний байт для символа завершения.

Вот ссылка на документацию snprintf: http://www.cplusplus.com/reference/cstdio/snprintf/

...