0

我正在尝试向后读取文件(例如文件末尾的 10 行)。newline_counter每次读取'\n'时,我都会增加我的新行计数器( )。一旦newline_counter到达user_num(参数),比如 10 行,lseek()就会停在当前位置(current_pos)。我正在返回这个位置,以便我可以在另一个函数中使用这个位置,该函数使用lseek()这个位置并开始从这个位置读取并写入到文件末尾。我已经成功编译了程序,但是一旦我开始运行它,程序就一直在运行并且没有输出。

int func_line_mode(int infile, int user_num) {
    char c;
    int newline_counter = 0;
    int current_pos = 0;
    int end = lseek(infile, 0, SEEK_END);

    int counter = 0;

    while (counter < end || newline_counter <= user_num) {
        lseek(infile, current_pos, SEEK_END);
        read(infile, &c, sizeof(char));
        if (strcmp(&c,"\n") == 0) {
            newline_counter++;
        }
        current_pos--;
        counter++;
    }

    return current_pos;
}
4

1 回答 1

1

您的代码存在一些问题:

  1. 条件不对,while应该是:

    while (counter < end && newline_counter <= user_num)
    
  2. 在 之后while,您在最后一个换行符之前留下一个字节,因此您应该向前移动 2 个字节以准确:

    if (current_pos < 0)
        current_pos += 2;
    
  3. lseek()返回 an off_t, not int,所以你应该这样做:

    off_t end = lseek(infile, 0, SEEK_END);
    
  4. 因此,您用来进行比较的其他变量也应该off_t如此,最重要的是函数的返回类型也是如此。

  5. strcmp(&c,"\n")错了,要比较一个字符,你可以这样做c == '\n'

1 号可能是您的问题的原因。其他点也应该修复,特别是第 4 点。


一旦上述所有问题都得到解决,该功能就可以正确地为我工作。这是一个工作示例:

#include <sys/types.h>
#include <unistd.h>
#include <fcntl.h>
#include <stdio.h>

off_t func_line_mode(int infile, int user_num) {
    char c;
    int newline_counter = 0;
    off_t current_pos = 0;
    off_t end = lseek(infile, 0, SEEK_END);
    off_t counter = 0;

    while (counter < end && newline_counter < user_num) {
        lseek(infile, current_pos, SEEK_END);
        read(infile, &c, 1);

        if (c == '\n')
            newline_counter++;

        current_pos--;
        counter++;
    }

    if (current_pos < 0)
        current_pos += 2;

    return current_pos;
}

int main() {
    char buf[100];
    int nread, nwrite;

    int fd = open("test.txt", O_RDONLY);

    // Last 3 lines.
    off_t off = func_line_mode(fd, 3);

    printf("off = %d\n", off);

    // Go back.
    lseek(fd, off, SEEK_END);

    while (nread = read(fd, buf, 100)) {
        nwrite = 0;

        while (nwrite < nread)
            nwrite += write(1, buf + nwrite, nread - nwrite);
    }

    return 0;
}
于 2019-08-29T09:55:07.093 回答