我一直在搜索如何使用 fgets
分配动态缓冲区,但我似乎无法在这个示例中找到它。该文件有两个未知长度的数字,由空格分隔。对于每一行,它读取每个字符,直到 ' '
和 \n
并打印出来。
char *ptr;
char line[MAX];
while(fgets(line, sizeof line , fp) != NULL){
ptr = line;
for(i=0; i<2; i++){
while(*ptr && (*ptr) != ' '){
if(*ptr == ' ')
break;
k = (*ptr) - '0';
if(k != -38) // wont print '\n'
printf("%d", k);
ptr++;
}
while(*ptr && (*ptr) != '\n') {
if(*ptr == ' '){
ptr++;
continue;
}
k = (*ptr) - '0';
printf("%d", k);
ptr++;
}
}
}
Can someone give me an idea on how to make
line
dynamic while still usingptr
that way?
最佳答案
我想你想要的是这样的:
size_t linelen = 80;
char *line = malloc(linelen);
while(magic_reallocating_fgets(&line, &linelen, fp) != NULL) {
/* ... do whatever you want with line ... */
}
但是,当然,64,000 美元的问题是,magic_reallocating_fgets
是什么样子的?它是这样的:
char *magic_reallocating_fgets(char **bufp, size_t *sizep, FILE *fp) {
size_t len;
if(fgets(*bufp, *sizep, fp) == NULL) return NULL;
len = strlen(*bufp);
while(strchr(*bufp, '\n') == NULL) {
*sizep += 100;
*bufp = realloc(*bufp, *sizep);
if(fgets(*bufp + len, *sizep - len, fp) == NULL) return *bufp;
len += strlen(*bufp + len);
}
return *bufp;
}
那不是真正完整的代码,它几乎是伪代码。我给你留了两件事作为练习:
它没有对 malloc
和 realloc
调用进行错误检查。
它的效率非常低,因为它在读取的每一行上都进行两次额外的传递:计算字符数,然后再次查找 '\n'
。 (事实证明,fgets
的界面不适合此类工作。)
关于c - C 中的动态缓冲区 fgets,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37124003/