我将文本读入缓冲区后如何逐行读取?

首先,我通过调用fread将文本读入缓冲区,然后我想逐行读取它,怎么做? 我尝试使用sscanf,但它似乎不起作用。

char textbuf[4096]; char line[256]; FILE *fp; fp = fopen(argv[1],"r"); memset(textbuf, 0, 4096); fread(textbuf, 1, 4096, fp); 

我知道使用fgets是一个好方法。 我只是想知道天气这个方法可以做同样的事情。

试试这个:

 fgets(textbuf, sizeof(textbuf), fp); 

对于逐行读取,您可以使用: fgets(line, 128, fp)getline(&line, &size, fp);

编辑

如果要从变量中读取它,请查看strtok()函数:

 char * line = strtok(strdup(buffer), "\n"); while(line) { printf("%s", line); line = strtok(NULL, "\n"); } 

您可以使用strchr()找到行尾字符的位置,如下所示:

 char *eol = strchr(line, '\n'); 

*eol之前的所有内容都是第一行。 然后从line前进到eol + 1 ,删除任何后续的\r\n字符,并重复此过程,直到strchr()返回NULL以指示不再有换行符。 此时,将任何剩余数据移动到缓冲区的开头,并从文件中读取下一个块。

如果您担心效率,可以避免使用2个缓冲区并在它们之间交替移动数据,但如果文件有很多行,即使是天真的方法也可能比fgets()更快。

怎么样strtok

 char *line; line = strtok(texbuf, '\n'); 

你说“我知道使用fgets是一种好方法。我只想知道天气这个方法可以做同样的事情。”当然你可以,你只需要重新实现f库中的fgets。 c库实际上并不是逐行读取的,它会读取整个块并在调用fgets时为您提供一行。

不是一种有效的方式,而是一种你必须要做的事情的样本。

 #include  typedef struct my_state { unsigned char * buf; int offset; int buf_size; int left; FILE * file; } my_state_t; int takeone(my_state_t * state) { if ((state->left - state->offset)<=0) { if (feof(state->file)) return -1; state->left = fread(state->buf,1,state->buf_size,state->file); state->offset = 0; if (state->left == 0) return -1; } return state->buf[state->offset++]; } int getaline(my_state_t * state, char * out, int size) { int c; c = takeone(state); if (c < 0) return 0; while (c >=0 && size > 1) { *out++ = c; --size; if (c == '\n') break; c = takeone(state); } *out=0; return 1; } int main(int argc, char ** argv){ FILE *fp; char textbuf[4096]; char line[256]; my_state_t fs; fs.buf=textbuf; fs.offset=0; fs.buf_size=4096; fs.left=0; fp = (argc>1)? fopen(argv[1],"rb") : stdin; fs.file = fp; while (getaline(&fs,line,256)) { printf("-> %s", line); } fclose(fp); }