我在尝试从用户输入中打开文件时遇到了问题。如果文件名在第一次输入时是正确的,我可以打开它,但如果在while循环中它是正确的则不能打开。
char file[256], *end;
printf("Enter the name of the file: ");
fgets(file, 256, stdin);
if((end=strchr(file, '\n'))!=NULL)
*end='\0';
FILE *fp=fopen(file, "r");
while(fp==NULL)
{
printf("The given file doesn't exist. Enter a file name: ");
fgets(file, 256, stdin);
if((end=strchr(file, '\n'))!=NULL)
*end='\0';
FILE *fp=fopen(file, "r");
}
答案 0 :(得分:0)
你需要在这里考虑一下平台,让你的代码跨平台文件检查方法是不同的。如果平台不重要,那么您不必担心Windows,在Linux中您可以使用stat utility。
检查文件是否存在的简单方法(检查读取模式):
int read_file_exists(const char *filename)
{
FILE *fp = fopen (filename, "r");
if (fp!=NULL) fclose (fp);
return (fp!=NULL);
}
点击此链接,了解有关C file check.
的更多信息答案 1 :(得分:0)
如果文件名在第一次输入时是正确的,我可以打开它,但如果在while循环中它是正确的则不能。
不,你被骗了。问题是while(fp==NULL)
中的循环条件测试了在循环外部声明的变量fp
的值,并且在循环内部你永远不会设置该变量,所以如果你输入你永远不会退出。
但这并不意味着您无法在第二次尝试或后续尝试时打开文件。在循环内部,您声明另一个变量fp
,“遮蔽”外部的变量,并将fopen()
的结果分配给它。当fopen()
成功时,您实际上会忽略结果。
另一个,现在已删除,答案说,主要做的是修复循环,使其使用外部使用的相同fp
。实现的最小变化将产生这个版本的循环:
while(fp==NULL)
{
printf("The given file doesn't exist. Enter a file name: ");
fgets(file, 256, stdin);
if((end=strchr(file, '\n'))!=NULL)
*end='\0';
fp=fopen(file, "r");
}
您输入文件名的方式还存在其他问题,包括前面的代码和前面的代码,以及一些不必要的代码重复,但只要用户输入的文件名简单又短,会做的。