Fopen无法从命令行读取

时间:2018-09-08 05:28:28

标签: c null file-pointer

打开基于的NULL

'fopen' return a 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时,它总是显示错误报告“无法打开...。”

所以混乱是

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

1 个答案:

答案 0 :(得分:2)

代码中很少有问题。首先,这

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);
}