Передача содержимого файла FILE в неизвестный размер char * (динамическое выделение)

У меня есть FILE * из трубы (popen), и я хочу передать его char *artist . Размер информации, которая будет в ФАЙЛЕ, неизвестна, поэтому он должен использовать malloc() .

 FILE *tmp1; char *artist; tmp1 = popen("cmus-remote -Q | grep 'tag artist' | sed s/'tag artist'/''/g | sed '1s/^.//'", "r"); 

Как я могу это сделать?

Способ сделать это – использовать временный буфер, чтобы читать fragmentы и присоединить их к художнику следующим образом:

 char buf[8192]; char *artist = NULL; size_t len = 0, total_len = 0; FILE *fp; fp = popen("cmus-remote -Q | grep 'tag artist' | sed s/'tag artist'/''/g | sed '1s/^.//'", "r"); while (!feof(fp)) { if ( fgets(buf, sizeof(buf), fp) == NULL ) break; len = strlen(buf); artist = realloc(artist, len+1); /* +1 for \0 */ if (artist == NULL) { fprintf(stderr, "Ran out of memory\n"); exit(-1); } strncpy(artist+total_len, buf, len+1); /* concatenate the string at the end of artist */ total_len += len; } 

Самый простой способ сделать это на машине с POSIX getline() :

 char *buffer = 0; size_t bufsiz = 0; ssize_t nbytes; FILE *tmp1 = popen("cmus-remote -Q | sed -n '/tag artist./ { s/tag artist//g; s/^.//p; }'", "r"); if (tmp1 == 0) …report problem and do not use tmp1… while ((nbytes = getline(tmp1, &buffer, &size)) > 0) { …process line of data… } free(buffer); 

Это ограничивает ваши строки размером выделенной памяти; это редко является реальным ограничением. Обратите внимание, что для обработки вывода cmus-remote требуется только одна команда sed .