6

まず、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 を使用するのが良い方法であることはわかっています。この方法で同じことができるかどうかを知りたいだけです。

4

4 に答える 4

10

これを試して:

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");
}
于 2012-05-12T02:22:53.820 に答える
8

次のようにstrchr()を使用して、行末文字の位置を見つけることができます。

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

前のすべて*eolが最初の行です。次に からlineに進み、後続のまたは文字eol + 1をすべて削除し、改行文字がなくなるまでプロセスを繰り返します。その時点で、残りのデータをバッファーの先頭に移動し、ファイルから次のチャンクを読み取ります。\r\nstrchr()NULL

効率が気になる場合は、2 つのバッファーを使用してそれらを交互に使用することでデータの移動を回避できますが、単純な方法でfgets()さえ、ファイルに多くの行がある場合よりもおそらく高速です。

于 2012-05-12T02:30:25.337 に答える
2

ストトークはどうですか

char *line;
line = strtok(texbuf, '\n');
于 2012-05-12T02:23:26.373 に答える
0

「fgets を使用するのが良い方法であることはわかっています。このメソッドが同じことを実行できるかどうかを知りたいだけです。」もちろん、c ライブラリのように fgets を再実装するだけで実行できます。c ライブラリは、実際には行ごとに読み取るのではなく、チャンク全体を読み取り、fgets を呼び出すと行を提供します。

効率的な方法ではありませんが、やらなければならないことの例です。

#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);
}
于 2012-05-12T02:29:37.877 に答える