打开基于的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无法从命令行读取?
答案 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);
}