首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >C lseek行为不端

C lseek行为不端
EN

Stack Overflow用户
提问于 2020-11-05 02:17:42
回答 1查看 78关注 0票数 1

我正在尝试写一个程序来模仿C语言中的tail行为。当在文件中搜索'/n‘字符时,我从lseek得到了一个奇怪的行为。下面是相关的代码片段:

代码语言:javascript
复制
   FILE *myfile = fopen(argv[i], "r");
    if (myfile == NULL) {
        printf("File not valid. Skipping.\n");
        continue;
    }
    //Go to the end of the file - You have to find the pos of the n lines.
    off_t pos = lseek(fileno(myfile), 0, SEEK_END);

    
    if (pos == -1) {
        perror("Lseek");
    }
    int l = 0;
    int temp = 10; //ofc there is a lines variable not hardcoded, this is just for testing purposes
    pos--;
    off_t pos2 = lseek(fileno(myfile), pos, SEEK_SET);
    printf("pos2: %ld\n", pos2);
    
    off_t curpos = 0;
     
    while ((l = fgetc(myfile)) != EOF && temp >= 0) {
        curpos = lseek(fileno(myfile), 0, SEEK_CUR);
        printf("Curpos: %ld; pos: %ld\n", curpos, pos);

        if (l == '\n') {
            temp--;
        }
        pos--;
        lseek(fileno(myfile), pos, SEEK_SET);
    }

运行这段代码,我得到了以下printf语句:

代码语言:javascript
复制
pos2: 25699
CurPos: 25700; pos: 25699 //EOF
CurPos: 25700; pos: 25698 //EOF
CurPos: 25697; pos: 25697
CurPos: 25700; pos: 25696 //EOF
CurPos: 25695; pos: 25695
CurPos: 25694; pos: 25694
CurPos: 25693; pos: 25693
CurPos: 25700; pos: 25692 //EOF
CurPos: 25691; pos: 25691
CurPos: 25690; pos: 25690
CurPos: 25689; pos: 25689
CurPos: 25688; pos: 25688
CurPos: 25687; pos: 25687
CurPos: 25686; pos: 25686
CurPos: 25685; pos: 25685
and so on but it never goes to EOF again

因此,它转到EOF四次,并再次读取EOF之前的最后一个'\n‘,给我错误的结果。

切换while主体:

代码语言:javascript
复制
while (pread(fileno(myfile), &l, 1, pos) != 0 && temp >= 0) {

        if (l == '\n') {
            temp--;
        }
        pos--;
    }

为我提供了预期的行为。

所以,我想知道,为什么我的第一次身体被打破了?

编辑:固定格式和无关紧要的内容

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-11-05 03:39:44

您不应该将对FILE *的操作与对底层文件描述符的操作混为一谈。如果您在文件描述符上执行lseek,那么对fgetc的后续调用将是...不对。使用fseek而不是lseek

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/64685604

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档