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