5.8 練習問題2 バッファ中の '\n' を数えてファイルの行数を出力する
wc -l と同じ機能
もうズルして、これは解答例を読む
code:wc-l-syscall.c
static void do_word_count(int fd, const char *path);
static void die(const char *s);
int
main(int argc, char *argv[])
{
int i;
if (argc < 2) {
fprintf(stderr, "%s: file name not given\n", argv0); exit(1);
}
for (i = 1; i < argc; i++) {
int fd = open(path, O_RDONLY);
if (fd < 0) die(path);
do_word_count(fd, path);
if (close(fd) < 0) die(path);
}
exit(0);
}
code:wc-l-syscall.c
static void
do_word_count(int fd, const char *path)
{
unsigned long count = 0;
for (;;) {
int n = read(fd, buf, sizeof buf);
if (n < 0) die(path);
if (n == 0) break;
unsigned long i;
for (i = 0; i < BUFFER_SIZE; i++) {
count++;
}
}
}
printf("%lu\n", count);
}
核心部
code:example.c
for (;;) {
int n = read(fd, buf, sizeof buf);
if (n < 0) die(path);
if (n == 0) break;
unsigned long i;
for (i = 0; i < BUFFER_SIZE; i++) {
count++;
}
}
}
エラー処理を除くと
code:example2.c
for (;;) {
int n = read(fd, buf, sizeof buf); // read()
if (n == 0) break; // EOF
unsigned long i;
for (i = 0; i < BUFFER_SIZE; i++) {
if (bufi == '\n') { // count '\n' count++;
}
}
}
code:wc-l-syscall.c
static void
die(const char *s)
{
perror(s);
exit(1);
}