Fopen не в состоянии читать из командной строки - PullRequest
0 голосов
/ 08 сентября 2018

Fopen возвращает NULL на основе

'fopen' возвращает NULL

теперь у меня есть один файл для чтения, и я хочу вывестив консоли, но выдает ошибку, так как fp возвращает NULL, здесь фрагмент

#include<stdio.h>

int main(char argc,char **argv)
{
      if(argc < 2)
      {
            printf("Usage:\t");
            printf("Hash File path");
      }

      printf("Hash File  : %s\n", argv[1]);
      FILE *fp = fopen("argv[1]","r");
      if(fp == NULL)
      {            
            fprintf(stderr,"Can't open %s\n", argv[1]);
      }
      else
      {
           char buff[100];
           while(!feof(fp))
           {
                if(fgets(buff,100,fp) == NULL) break;
                fputs(buff,stdout);
           }
            fclose(fp);
      }
      return 0;
}

всякий раз, когда я передаю путь E: \ design \ test.txt из командной строки, он всегда показывает сообщение об ошибке "Может't open .... "вот так

, поэтому путаница в

почему Fopen не удалось прочитать из командной строки?

1 Ответ

0 голосов
/ 08 сентября 2018

В коде мало проблем. Во-первых, это

FILE *fp = fopen("argv[1]","r");

неправильно. Первый параметр fopen() должен быть просто argv[1] вместо "argv[1]". Например,

FILE *fp = fopen(argv[1],"r");
if(fp == NULL) {            
     fprintf(stderr,"Can't open %s\n", argv[1]);
     return 0; /* this you forgot, if fopen fails,then no need to proceed further */
}

Также, если argc<2 имеет значение true, тогда простого написания printf() недостаточно, вы должны попросить пользователя ввести правильный ввод в командной строке и не позволять пользователю продолжать работу. Должно быть

if(argc < 2) {
      printf("Usage:\t");
      printf("Hash File path");
      return 0; /* return from here or use exit(0) */
 }

Во-вторых, прочитайте здесь , почему feof() не так. Вы можете использовать его как

while(fgets(buff,100,fp) != NULL) { /* no need to use break */
        fputs(buff,stdout); 
}

вместо

while(!feof(fp))
{
        if(fgets(buff,100,fp) == NULL) break;
        fputs(buff,stdout);
}
...