【问题标题】:Implementing rev command in C using POSIX system functions使用 POSIX 系统函数在 C 中实现 rev 命令
【发布时间】:2019-11-04 23:34:21
【问题描述】:

我正在尝试仅使用系统调用在 C 中实现 rev linux 调用。我能够实现它,但我的代码也反转了文件的行,因此第 1 行现在是文件中的最后一行。最后一行也不会跳到标准输出上的新行。我不确定它为什么这样做。

这是我的代码:

#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);
  }

输入

Contents of file 1:
Hello World
Hi World 

输出

dlroW iH
dlroW olleH

期望的输出:

dlroW olleH
dlroW iH

【问题讨论】:

  • 您的代码没有使用任何系统调用。
  • @Dai read, write, lseek都是linux系统调用。
  • 它们是 POSIX 系统函数。我以为你的意思是你会使用 syscall 函数。
  • @Dai 好的,我会改写以避免混淆

标签: c linux file operating-system reverse


【解决方案1】:

您的代码清楚地向后读取文件,一次一个字符,并在读取时打印每个字符。为什么你会认为它会逐行反转?它甚至没有尝试注意每一行的结束位置。

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

【讨论】:

  • 它会在读取时注意到每行何时结束。我不必编写代码,如果所有文本都不是单行,我正在谈论文件结构。如果文件中有新行,它将在下一行的 stdout 中打印。
  • 我的问题是 rev 产生所需的输出,而我的程序产生我粘贴的正常输出。我想复制 rev 并且想知道我是否可以这样做?
  • @HotWheels 您是否尝试过调试您的代码并了解为什么它向后而不是向前打印行?你有吗?尝试单步执行输入行 Hiho 并查看为什么它首先输出 \no,而不是您期望的 i
  • @hotwheels:您读取的第一个字符是文件中的最后一个字符,而不是文件第一行中的最后一个字符。如果要反转文件中的每一行,保持文件的顺序,则必须按顺序读取行并单独反转每一行。
猜你喜欢
  • 2010-11-25
  • 1970-01-01
  • 2010-10-20
  • 1970-01-01
  • 2013-04-01
  • 1970-01-01
  • 2014-10-06
  • 1970-01-01
  • 2013-01-20
相关资源
最近更新 更多