【问题标题】:How to fopen a file in a different location?如何在不同的位置打开文件?
【发布时间】:2013-10-27 09:03:12
【问题描述】:

我正在尝试打开位于不同目录中的文件,但我总是收到错误消息。我的代码如下所示:

#include <stdio.h>   
#include <stdlib.h>

int main()
  {
  FILE *file;
  char file_name[25];

  printf("What file do you want? ");
  scanf("%s", file_name);
  file = fopen("Dir1/Dir2/file_name","r"); 

  if( file == NULL ) 
  {
    printf("There is no file by that name\n");
    exit;
 }

我怀疑问题出在“fopen”部分。如果我输入一个文件名(例如 file =fopen ("Dir1/Dir2/list.txt", "r") 那么它将起作用。但是,我希望用户输入文件名。任何帮助将不胜感激. 谢谢!

【问题讨论】:

  • 您在处理用户输入时犯了一个非常根本的错误:如果您不知道输入内容的长度(并且您永远不知道用户做了什么),请对其进行硬性限制。您可以使用fgets() 而不是scanf() 执行此操作,也可以使用安全的scanf 格式字符串,例如%24s。
  • 注意:文件名可能包含空格。 scanf("%s", file_name) 不会将它们扫描到 file_name。考虑scanf("%24[\^n]", file_name) 或fgets()。

标签: c fopen


【解决方案1】:

您的代码尝试打开名为“file_name”的文件。我想你的意思是:

#include <stdio.h>   
#include <stdlib.h>

int main()
{
  FILE *file;
  char file_name[25];
  char path[80];

  printf("What file do you want? ");
  scanf("%s", file_name);
  snprintf(path, sizeof(path), "Dir1/Dir2/%s", file_name);
  // printf("Opening file %s\n", path);
  file = fopen(path,"r"); 

  if( file == NULL ) 
  {
    printf("There is no file by that name\n");
    exit;
  }

【讨论】:

  • 如果您不使用 sprintf() 处理用户输入,您的回答将值得 +1。如果用户输入超过 80 个字符的字符串怎么办? (好吧,在这对path 产生影响之前,file_name 会溢出。但那值得一提。)`
  • 你说得对,但由于提问者使用 scanf,我猜想超支不是主要问题。不过会编辑。
  • 恕我直言,超支始终是一个问题 - 尽早教初学者正确的事情总是更好。
  • 在这种特殊情况下,sprintf() 确实是安全的,因为 80 >> 25 + 路径字节,但最好习惯 snprintf(path, sizeof path, ...)。所以+1 :-)
猜你喜欢
  • 1970-01-01
  • 2014-05-03
  • 1970-01-01
  • 2022-07-21
  • 2023-03-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多