使用POSIX系统函数在C中实现rev命令

使用POSIX系统函数在C中实现rev命令,c,linux,file,operating-system,reverse,C,Linux,File,Operating System,Reverse,我试图在C中只使用系统调用来实现rev linux调用。我能够实现它,但我的代码也反转了文件的行,所以现在第1行是文件中的最后一行。最后一行也不会跳转到stdout上的新行。我不知道它为什么这样做 这是我的密码: #include <stdlib.h> #include <fcntl.h> #include <unistd.h> #include <string.h> #include <stdio.h> #include <sy

我试图在C中只使用系统调用来实现rev linux调用。我能够实现它,但我的代码也反转了文件的行,所以现在第1行是文件中的最后一行。最后一行也不会跳转到stdout上的新行。我不知道它为什么这样做

这是我的密码:

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

#define LINE_BUFFER 1024

int charCount(const char *name1);

int main(int argc, char* argv[]) {

    if(argc ==2){
        charCount(argv[1]);
    }else{
            printf("Provide a file\n");
}
return 0;
}


int charCount(const char *name1)
{
    char buffer[LINE_BUFFER];
    int fd;
    int nread;
    int i = 0;
    if ((fd = open(name1, O_RDONLY)) == -1)
    {
      perror("Error in opening file");
      return (-1);
    }

    int size = lseek(fd,-1,SEEK_END);
    while(size>=0)
    {
        nread=read(fd,buffer,1);
        write(1,buffer,1);
        lseek(fd, -2,SEEK_CUR);
        size--;
    }
    close(fd);
    return(0);
  }
输出

dlroW iH
dlroW olleH
期望输出:

dlroW olleH
dlroW iH

代码清楚地向后读取文件,每次读取一个字符,并在读取时打印每个字符。你为什么认为它会一行一行地倒转?它甚至都没有注意到每一行的终点


如果您向后读取文件,您要读取的最后一个字符(因此您要打印的最后一个字符)是文件中的第一个字符,通常不是换行符。

您的代码没有使用任何系统调用。@Dai read、write、lseek都是linux系统调用。它们是POSIX系统函数。我以为你的意思是要使用
syscall
函数。@Dai哦,好的,我会重写以避免混淆。它在读取时会注意到每一行的结尾。我不需要编写代码,我说的是文件结构,如果所有的文本不是一行。如果文件中有新行,它将在下一行的标准输出中打印它。我的问题是rev生成所需的输出,而我的程序生成我粘贴的正常输出。我想复制rev,想知道我是否能做到这一点?@hotweels您是否试过调试您的代码,并了解它为什么向后而不是向前打印行?例如,您是否尝试过在输入行中单步执行
Hi
ho
,并了解为什么它会先输出
\n
o
,而不是按您期望的方式输出
i
。@hotweels:您读取的第一个字符是文件中的最后一个字符,而不是文件第一行中的最后一个字符。如果要反转文件中的每一行,使文件保持有序,则必须按顺序读取这些行,然后分别反转每一行。
dlroW olleH
dlroW iH