C - 使用用户输入文件名

时间:2017-03-28 17:55:31

标签: c

我在尝试从用户输入中打开文件时遇到了问题。如果文件名在第一次输入时是正确的,我可以打开它,但如果在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");
}

2 个答案:

答案 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");
}

您输入文件名的方式还存在其他问题,包括前面的代码和前面的代码,以及一些不必要的代码重复,但只要用户输入的文件名简单又短,会做的。