如何用C语言编写我自己版本的tail unix命令?

如何用C语言编写我自己版本的tail unix命令?,c,linux,unix,C,Linux,Unix,我想为tailunix命令编写自己的代码,但在这方面我遇到了很多麻烦。我对C语言完全陌生,显然对如何修复代码一无所知。我的代码有很多问题: 我无法读取和打印if语句中文本文件中的行,运行时它没有打印文件中的任何字符串不知道为什么 无法通过将用户输入作为起始行然后打印到文件末尾来打印if语句中的特定行 我很难找到问题的正确解决方案,也无法调试代码中存在的问题 我非常感谢您帮助我在代码中完成以上所有工作。如果有人能帮我修改代码,让我的代码正常工作 #include <stdio.h>//

我想为tailunix命令编写自己的代码,但在这方面我遇到了很多麻烦。我对C语言完全陌生,显然对如何修复代码一无所知。我的代码有很多问题:

  • 我无法读取和打印if语句中文本文件中的行,运行时它没有打印文件中的任何字符串不知道为什么
  • 无法通过将用户输入作为起始行然后打印到文件末尾来打印if语句中的特定行
  • 我很难找到问题的正确解决方案,也无法调试代码中存在的问题
  • 我非常感谢您帮助我在代码中完成以上所有工作。如果有人能帮我修改代码,让我的代码正常工作

    #include <stdio.h>// for fopen, fscanf, fclose, fprintf
    #include <stdlib.h>// for exit
    #include <string.h>
    
    int main(int argc, const char * argv[]){
    
        printf("Opening file\n");
        char filename[64]; // file attribute
        strcpy(filename, argv[1]); //copy string from argv[1] to filename
        printf("FILENAME: %s \n", filename);
        FILE* fp; // file pointer
        int ch, linestotal = 0, user;
        char c[10000];
    
        if(argv[2]){       //checking input argv[2]
         user = atoi(argv[2]);      // char to int
        }
    
        fp = fopen( filename, "r"); // file read
    
        if(fp == NULL){     // verify file is opened
            printf("Error opening file");
            exit(1);
        }
    
        while(!feof(fp)) // check end of file
        {
            ch = fgetc(fp);
            if(ch == '\n')
            {
                linestotal++;    //Checking total lines inside file
            }
        }
    
        printf("Total no. of lines: %d\n", linestotal );
        printf("User input: %d\n", user );
    
        printf("**********************\n");
        if (!user && linestotal<= 10)
        {
            while ( (ch = fgetc(fp) ) != EOF)
                printf("%c", ch);
    
            fclose(fp);
            printf("********************\n");
        }if(!user && linestotal>10) {  // to print 10 lines
            for(int i = (linestotal-10); i <= (linestotal); i++)
            {   c[i] = fgetc(fp);
                printf("%c", c[i]);
            }
            fclose(fp);
            printf("********************\n");
    
        }if(user && user<linestotal) {
            for(int i = (linestotal-user); i <= (linestotal); i++)
            {   c[i] = fgetc(fp);
                printf("%c", c[i]);
            }
            fclose(fp);
            printf("********************\n");
        }if(user && user>linestotal){
            while ( (ch = fgetc(fp) ) != EOF)
                printf("%c", ch);
    
            fclose(fp);
            printf("********************\n");
        }else{
            printf("Unable to read and print file \n");
        }
    
        printf("End of file");
        return 0;
    }
    
    #包括//用于fopen、fscanf、fclose、fprintf
    #包含//以退出
    #包括
    int main(int argc,const char*argv[]{
    printf(“打开文件”);
    char filename[64];//文件属性
    strcpy(文件名,argv[1]);//将字符串从argv[1]复制到文件名
    printf(“文件名:%s\n”,文件名);
    FILE*fp;//文件指针
    int ch,linestotal=0,用户;
    字符c[10000];
    if(argv[2]){//正在检查输入argv[2]
    user=atoi(argv[2]);//字符到int
    }
    fp=fopen(文件名,“r”);//文件读取
    如果(fp==NULL){//验证文件是否打开
    printf(“打开文件时出错”);
    出口(1);
    }
    while(!feof(fp))//检查文件结尾
    {
    ch=fgetc(fp);
    如果(ch='\n')
    {
    linestotal++;//检查文件中的行总数
    }
    }
    printf(“行总数:%d\n”,linestotal);
    printf(“用户输入:%d\n”,用户);
    printf(“************************\n”);
    如果(!user&&linestotal10){//打印10行
    
    对于(int i=(linestotal-10),我一次只问一个问题。并将其具体化。“我无法…”并不能很好地描述您需要的帮助。请准确解释该部分的代码有什么问题,或者为什么您“无法”。好的,您先读取到EOF,然后尝试读取同一个文件句柄,根据用户输入和文件长度,检查或忘记检查EOF。然后是
    fgetc
    。稍后您将得到正确答案:
    while((ch=fgetc(fp))!=EOF)
    。你可以看看gnu或bsd版本的
    tail
    作为一个可以做什么的例子。只需谷歌…@kaylum我已经编辑了我的问题,很抱歉沟通错误,我在堆栈溢出上新建了一个。我需要在If循环中打印文件文本的帮助。它不允许我打印任何我不知道的内容。为什么你可以帮助?
    while(!feof(fp))
    在循环之后,您的
    fp
    文件指针位于文件的末尾。您需要将文件指针返回到文件的开头或开始读取的位置。否则,从那一点开始,您将无法读取任何内容。一次只问一个问题。并具体说明。“我无法…”不是对您需要帮助的内容的良好描述。请准确解释该部分代码的问题所在,或者解释您“无法”的原因。好的,您先读取到EOF,然后尝试读取同一个文件句柄,根据用户输入和文件长度,检查或忘记检查EOF。然后是
    fgetc
    。稍后您将得到正确答案:
    while((ch=fgetc(fp))!=EOF)
    。你可以看看gnu或bsd版本的
    tail
    作为一个可以做什么的例子。只需谷歌…@kaylum我已经编辑了我的问题,很抱歉沟通错误,我在堆栈溢出上新建了一个。我需要在If循环中打印文件文本的帮助。它不允许我打印任何我不知道的内容。为什么你可以帮助?
    while(!feof(fp))
    在该循环之后,
    fp
    文件指针位于文件的末尾。您需要将文件指针返回到文件的开头或开始读取的位置。否则,您将无法从该点读取任何内容。