c - libuv fs 读取文件再打印一次

标签 c libuv

最近我正在编写一些c代码来简单地使用libuv读取文件并打印内容。
但我不知道为什么我的代码会打印第一个缓冲区两次。

void open_cb(uv_fs_t* open_req){
    int r = 0;
    if(open_req -> result < 0 ) printf("open_req");

    context_t* context = open_req -> data;

    size_t buf_len = sizeof(char) * BUF_SIZE;
    char *buf = malloc(buf_len);
    context->iov = uv_buf_init(buf, buf_len);
    context->times = 0;

    uv_fs_t *read_req = malloc(sizeof(uv_fs_t));
    context->read_req = read_req;
    read_req->data = context;
    r = uv_fs_read(uv_default_loop(), read_req, open_req->result, &context->iov, 1, 0, read_cb);    
}
void read_cb(uv_fs_t* read_req){
    int r = 0;

    //uv_fs_t* close_req = mollac(sizeof(uv_fs_t));
    if(read_req->result < 0){
        printf("read_req");
        return;
    }else if(read_req->result == 0){
        printf("read finish\n");
        return;
    }

    context_t* context = read_req->data;

    printf("%zu %zu", read_req->result, context->read_open_req->result);
    printf("%i :", context->times);
    printf("%s\n", context->iov.base);

    size_t buf_len = sizeof(char) * BUF_SIZE;
    char *buf = malloc(buf_len);
    context->iov = uv_buf_init(buf, buf_len);
    context->times++;
    read_req->data = context;

    r = uv_fs_read(uv_default_loop(), read_req, context->read_open_req->result, &context->iov, 1, -1, read_cb);
    if(r<0) printf("read_req");
}

我正在阅读此文件,其中只有一行文本:“hello1234567\n”, 缓冲区大小为 5,因此每次会打印 5 个字符。
然而结果是

read result:5, open result:10
time: 0 :hello
read result:5, open result:10
time: 1 :hello
read result:5, open result:10
time: 2 :12345
read result:3, open result:10
time: 3 :67

read finish

第一个数字是 read_req->result,第二个数字是 context->read_open_req->result。

其他代码与official tutorial类似

谢谢。

最佳答案

终于发现我的愚蠢错误了。
r = uv_fs_read(uv_default_loop(), read_req, open_req->result, &context->iov, 1, 0, read_cb);
参数偏移量应为 -1 而不是 0,以便从上一个偏移量读取。

关于c - libuv fs 读取文件再打印一次,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47556003/

相关文章:

c++ - c++ 可执行文件中存储了多少源信息

c++ - nodejs 插件异步回调与 libuv

c++ - 对 libuv 的来源有一些疑问吗?

sockets - Libuv - 单个连接上的多个 TCP 请求

java - 安全聊天应用程序 + GUI

c - 如何将 pdf 文件作为背景导入 GtkDrawingArea

c - 利布夫 : SO_REUSEPORT issue in Linux

c++ - 使用带有仿函数结构的 libuv 而不是函数回调

c - 释放一个字符串数组给出 SIGABRT

c - stdint.h 库中是否包含整数类型 "extended integer types"?