我有一个项目,我正在研究,这将是从终端上运行的另一个程序输出的输入,如下所示:
./other_program | ./project
所以我从other_program获取输出并在项目中使用
read(0, buffer, BUFF_SIZE);
但如果想象那不是最好的方法。我知道我可以遍历stdin并只使用realloc来增加缓冲区大小,但由于项目规范,我禁止使用realloc,这表示我只能使用malloc,读取,写入,打开和释放。
还有其他出路吗? 谢谢!
答案 0 :(得分:1)
如果您可以使用有界长度的块处理输入,则更喜欢重用该长度的缓冲区,并在每次迭代时使用memset清除它。如果你必须一次在内存中输入整个输入(或任意大部分),那么你将不得不模仿realloc作为@dolan提及。这可以这样做:
#define BUFFER_INCREMENT 128
// In some function somewhere...
size_t bufsize = BUFFER_INCREMENT;
char *buffer = malloc(bufsize * sizeof(char));
char *bufferp = buffer;
while( fgets(bufferp, BUFFER_INCREMENT, stdin) ){
size_t newSize = strlen(bufferp);
char *newbuffer = malloc( (bufsize + newSize) * sizeof(char) );
memcpy( newbuffer, buffer, bufsize );
free( buffer );
buffer = newbuffer;
bufferp += newSize;
bufsize += newSize;
}
答案 1 :(得分:1)
反复将数据读入本地缓冲区并将其附加到大缓冲区。
读取后,分配给bigbuf
的内存大小与读取的数据大小相同。
更强大的解决方案将使用指数增长(可能是1.5倍至3倍)bigbufsize
。
#define BUFF_SIZE 1024
char buffer[BUFF_SIZE];
char *bigbuf = NULL;
size_t bigbufsize = 0;
ssize_t len;
while( (len = read(0, buffer, sizeof buffer)) > 0) {
size_t newbigbufsize = bigbufsize + len;
char *newbigbuf = malloc(newbigbufsize);
if (newbigbuf == NULL) exit(1); //Handle OOM
memcpy(newbigbuf, bigbuf, bigbufsize);
memcpy(&newbigbuf[bigbufsize], buffer, len);
free(bigbuf);
bigbuf = newbigbuf;
bigbufsize = newbigbufsize;
}
// Use data
foo(bigbuf, bigbufsize);
// clean-up
free(bigbuf);
bigbuf = NULL;
bigbufsize = 0;
答案 2 :(得分:-1)
使用ft_concat;) 在stackoverflow之前向你的邻居询问!
就个人而言,我已经构建了一个链式列表,然后将其转换为char数组