-1

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 时,它总是显示错误报告“无法打开....”,如下所示

所以混乱是

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

4

1 回答 1

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) */
 }

其次,在这里阅读为什么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);
}
于 2018-09-08T05:37:50.650 回答