【问题标题】:First byte is not printed when using lseek [duplicate]使用 lseek 时不打印第一个字节 [重复]
【发布时间】:2018-04-30 10:21:34
【问题描述】:

我正在尝试使用系统调用输出文件的内容。代码运行良好,直到我们有一个只包含一行的文件。在这种情况下,输出是没有第一个字符的行。这个字符在哪里丢失了?

ssize_t rres,wres;
char buff[1];
off_t offset;
int fd = open("tester.txt",O_CREAT | O_RDWR , 0664 ); 
int line_count = 5;
for(count = 0;line_count != 0;count--){
    offset = lseek(fd, count, SEEK_END);
    rres = read(fd,buff,1);
    if(rres < 0){
        return -1;
    }
    if(*buff =='\n') line_count--;

}

count *= -1; // get abs value of bytes
count++;
while(count--){
    wres = write(STDOUT_FILENO,buff,read(fd, buff,1)); // output
}

我正在尝试输出文件的最后 5 行。但如果我的行数少于 5 行,则不会输出第一个字符。

【问题讨论】:

  • for 循环应该在做什么?
  • 提供剩余代码。
  • 更新代码,少了一行
  • 你想达到什么目的?这个 for 循环很奇怪。
  • 为什么line_count != 0被注释掉了?

标签: c file operating-system system-calls


【解决方案1】:

for 循环在结束之前从文件中读取一个字符。如果至少有 5 行,则它最后读取一个换行符,然后其余代码从该换行符之后开始读取。

但如果它到达文件的开头却没有找到 5 个换行符,则最后一个 read() 读取文件的第一个字符,其余代码从之后开始读取。

*buff != '\n' 时需要先打印该字符。

if (*buff != '\n') {
    write(STDOUT_FILENO, buff, 1);
}
count *= -1; // get abs value of bytes
count++;
while(count--){
    wres = write(STDOUT_FILENO,buff,read(fd, buff,1)); // output
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-02-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-11-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多