Fopen 无法从命令行读取

Fopen Fails to read from Command line

Fopen return NULL 基于

'fopen' return a NULL

现在我有一个文件要读取,我想在控制台上输出,但它会抛出一个错误,如 fp return NULL here a snippet

#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 时,它总是显示错误报告 "Can't open...." 就像这样

所以混淆是

为什么 Fopen 无法从命令行读取?

代码中几乎没有问题。首先,这个

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 为真,那么只写 printf() 是不够的,您必须要求用户提供正确的命令行输入,并且不要让用户继续。应该是

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

其次,阅读 here 为什么 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);
}