首先,我通过调用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
表示没有更多的换行符为止。此时,将任何剩余的数据移动到缓冲区的开头,并从文件中读取下一个块。fgets()
更快。那么关于strtok呢?
char *line;
line = strtok(texbuf, '\n');
strtok()
时要非常小心。它不是可重入的,并且在处理过程中修改其输入。 - Adam Lissfgets
是最简单的。 - Fei Xue#include <stdio.h>
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);
}
fgets
是一个库函数,而不是系统调用。 - Fei Xue
fgets()
逐行读取文件呢? - Adam Lissgetline()
。 - Jack