2011-11-17 54 views
0

我包含下面的代碼,很抱歉打擾你這麼多的代碼。參數解析是可以的,我用手錶檢查過它。我已經放了一些printf s來檢查問題出在哪裏,它似乎沒有打開文件cat作爲參數接收。它是從一個殼被稱爲「cat -b file爲什麼我的shell程序不能打開它作爲函數「cat」中的參數收到的文件

#include <stdio.h> 
#include <stdlib.h> 
#include <unistd.h> 
#include <string.h> 

#define TRUE 0 
#define FALSE 1 

void yes(int argc, char *argv[]); 
int cat(int argc, char *argv[]); 

//#include "cat.h" 
//#include "yes.h" 
//#include"tee.h" 

char buf[50],c[10], *p2,*p, *pch; 

int count; 
char *matrix[20]; 

void yes(int argc, char *argv[]) 
{ 
    int i; 
// if (argc >= 2 && *argv[1] == '-') 
    // { 
    //printf("ERROR!"); 
    //} 
    //if (argc == 1) 
    // { 
    while (1) 
     if (puts("y") == EOF) 
     { 
      perror("yes"); 
      exit(FALSE); 
     } 
    // } 

    while (1) 
     for (i = 1; i < argc; i++) 
      if (fputs(argv[i], stdout) == EOF || putchar(i == argc - 1 ? '\n' : ' ') == EOF) 
      { 
       perror("yes"); 
       exit(FALSE); 
      } 
    //exit(TRUE); 
} 



int main(int argc, char *argv[]) 
{ 
    //p=(char *)malloc(sizeof(char)*50); 
    do 
    { 
     fprintf (stderr, "$ "); 
     fgets (buf,50,stdin); 
     p=buf; 
     fprintf (stderr, "Comanda primita de la tastatura: "); 
     fputs (buf, stderr); 
     int i=0,j=0; 
     //strcpy(p,buf); 
     strcpy(c,"\0"); 
     while (buf[i] == ' ') 
     { 
      i++; 
      p++; 
     } 
     if (buf[i] == '#') 
      fprintf (stderr, "Nici o comanda, ci e un comentariu!\n"); 
     else 
     { 
      j=0; 
      while (buf[i] != ' ' && buf[i] != '\n') 
      { 
       i++; 
       j++; 
      } 
      strncpy (c,p,j); 
      fprintf (stderr, "%s\n",c); 
      if (strcmp (c,"yes") == 0) 
      { 
       p2 = p+j+1; 
       pch = strtok (p2," "); 
       count = 0; 
       while (pch != NULL) 
       { 
        //printf ("%s\n",pch); 
        matrix[count] = strdup(pch); 
        pch = strtok (NULL, " "); 
        count++; 
       } 
       yes(count, matrix); 
       fprintf (stderr, "Aici se va executa comanda yes\n"); 
      } 
      else if (strcmp (c,"cat") == 0) 
      { 
       p2 = p+j+1; 
       pch = strtok (p2," "); 
       count = 0; 
       while (pch != NULL) 
       { 
        //printf ("%s\n",pch); 
        matrix[count] = strdup(pch); 
        pch = strtok (NULL, " "); 
        count++; 
       } 
       cat(count,matrix); 
       fprintf (stderr, "Aici se va executa comanda cat \n"); 
      } 
      else if (strcmp (c,"tee") == 0) 
      { 
       //tee(); 
       fprintf(stderr, "Aici se va executa comanda tee\n"); 
      } 


      fprintf (stderr, "Aici se va executa comanda basename\n"); 

      strcpy(buf,"\0"); 
     } 
    } 
    while (strcmp(c, "exit") != 0); 
    fprintf (stderr, "Terminat corect!\n"); 
    return 0; 
} 
int cat(int argc, char *argv[]) 
{ 
    int c ; 

    opterr = 0 ; 
    optind = 0 ; 

    char number = 0; 
    char squeeze = 0; 
    char marker = 0; 

    fprintf(stderr,"SALUT< SUNT IN FUNCTIZE>\n"); 
    while ((c = getopt (argc, argv, "bnsE")) != -1) 
     switch (c) 
     { 
     case 'b' : 
      number = 1; 
      break; 
     case 'n' : 
      number = 2; 
      break; 
     case 'm' : 
      marker = 1; 
      break; 
     case 's' : 
      squeeze = 1; 
      break; 
     case 'E' : 
      marker = 1; 
      break; 
     } 
    if (optind + 1 != argc) 
    { 
     fprintf (stderr, "\tWrong arguments!\n") ; 
     return -1 ; 
    } 

    FILE * fd = fopen (argv[optind], "r"); 
    printf("am deschis fisierul %s ",argv[optind]); 
    if (fd == NULL) 
    { 
     printf("FISIER NULL asdasdasdasdasd"); 
     return 1; 
    } 

    char line[1025]; 
    int line_count = 1; 

    while (!feof(fd)) 
    { 
     fgets(line, 1025, fd); 
     printf("sunt in while :> %s",line); 
     int len = strlen(line); 
     if (line[len - 1] == '\n') 
     { 
      if(len - 2 >= 0) 
      { 
       if(line[len - 2] == '\r') 
       { 
        line[len - 2] = '\0'; 
        len -= 2; 
       } 
       else 
       { 
        line[len - 1] = '\0'; 
        len -= 1; 
       } 
      } 
      else 
      { 
       line[len - 1] = '\0'; 
       len -= 1; 
      } 
     } 

     if (squeeze == 1 && len == 0) 
      continue; 
     if (number == 1) 
     { 
      fprintf (stdout, "%4d ", line_count); 
      line_count++; 
     } 
     else if (number == 2) 
     { 
      if (len > 0) 
      { 
       fprintf (stdout, "%4d ", line_count); 
       line_count++; 
      } 
      else 
       fprintf (stdout, "  "); 
     } 
     fprintf(stdout, "%s", line); 
     if (marker == 1) 
      fprintf(stdout, "$"); 
     fprintf(stdout, "\n"); 
    } 

    fclose (fd); 

    return 0 ; 
} 
+0

執行此操作時屏幕上顯示的消息究竟是什麼? – Tudor

+1

你如何運行這個程序..?你在命令行參數中傳遞了什麼? –

+0

嘗試打印矩陣[optind]的內容並查看它是否確實是文件的名稱。 – Tudor

回答

3

的問題是,當您使用fgets它包括換行符到字符串。因此,當您傳遞文件名時,會附加一個輸入命令時輸入的\n字符。所以傳遞的文件名是不正確的。也許在這些線上(只是一個指針):

char *filename = strtok(argv[optind], "\n"); 
if(filename == NULL) 
{ 
    /*What the .... */ 
    Handle error! 
} 
FILE * fd = fopen (filename, "r"); 
printf("am deschis fisierul %s ",argv[optind]); 
if (fd == NULL) 
{ 
    printf("FISIER NULL asdasdasdasdasd"); 
    return 1; 
} 

希望這有助於!

PS:調試過程
fopen失敗時,它將設置errno。要獲得確切的錯誤,請使用strerror(errno);perror。因此在if(fd == NULL)中加入perror("fopen");顯示爲fopen : No such file or directory。接着打印文件名fprintf(stderr, "\n |%s|\n", argv[optind]);顯示文件名以換行符即

|hello.txt 
| 

...然後看到fgets。啊!從那裏開始的新行

+0

Oooooh,你有很好的眼睛和良好的知識,而且我有時習慣了我的優勢,fgets包括\ n到字符串。非常感謝你!並感謝您的小費。我會好好利用它。再次感謝,非常感謝! –

相關問題