【问题标题】:passing file name as argument将文件名作为参数传递
【发布时间】:2011-07-06 06:54:02
【问题描述】:
char fname[256];
printf("Enter file name\n");
scanf("%123s",fname);
strcat(fname,".txt");

FILE *inputf;
inputf=fopen(fname,"w");

if (inputf!=NULL)
    printf("found");
else
    printf("not found");

问题是,无论我输入什么文件名,我都会得到一个非 空指针。谁能解释一下为什么??

【问题讨论】:

  • 这段代码在什么环境下运行?你自己的电脑?共享终端,可能是学校电脑? SSH访问其他地方?如果你正在运行 linux,“ls -l”的输出是什么?因为您似乎缺乏写入文件系统的权限。
  • 你的代码在我的系统上编译得很好。如果不使用“w”参数退出,它会创建文件。你必须检查@junjanes 的建议。
  • 如果我没有权限怎么办??我可以抛出适当的错误消息吗?
  • 这是一个linux盒子吗?如果是#include <unistd.h> 并查询access(fname, W_OK)。如果文件可写,则返回 0。不同的非零返回值意味着不同的问题。谷歌“unistd access”了解更多信息。

标签: c file dynamic filenames


【解决方案1】:

fopen(filename,"w") 将创建一个新文件。因此,如果您输入的是合法的文件名并具有适当的文件系统权限,则应该会成功。

如果您尝试打开现有文件,请使用:

fopen(filename, "r")

(注意“r”模式,而不是“w”。)

【讨论】:

  • @samir - 那么参数应该是“r+”。这指定了一个已经存在的文件来读取和写入。该文件必须存在。
  • 不,我的意思是如果我想在硬盘上创建一个全新的文本文件???
  • "w" 无论是否存在现有文件,都会创建一个新文件。任何具有该名称的现有文件都将被丢弃。 ...回到你原来的帖子中的问题:你为什么想要一个 NULL 指针? [编辑将“r”更改为“w”]
  • @dappawit - 不,对于“r”,文件必须存在。虽然我提供的链接不是标准的,但您可以检查-cplusplus.com/reference/clibrary/cstdio/fopen
  • 是的,我的错误......我的意思是“w”。
【解决方案2】:

不是这个:

char fname[256]; 
printf("Enter file name\n"); 
scanf("%123s",fname); 
strcat(fname,".txt"); F
FILE *inputf; inputf=fopen(fname,"w");  // <--!!!
if (inputf!=NULL) printf("found"); 
else printf("not found");

但是这个:

字符 fname[256]; 文件 *inputf;

输入f=fopen(fname,"w");
printf("请输入文件名\n");

// 你知道你永远不能使用 scanf() 所以 // 移除这个定时炸弹并使用其他东西 scanf("%123s",fname);

strcat(fname,".txt"); 输入f=fopen(fname,"w"); if (inputf!=NULL) { printf("找到"); } 别的 { printf("未找到"); }

现在,哪个指针不是 NULL?你不可能像你拥有的那样编译代码,那么你怎么知道什么是 NULL 或不是 NULL?

--皮特

【讨论】:

  • inputf 如果在系统上找不到文件,则应为空。所以即使我输入了无效的文件名,它也不为空。
  • 你能告诉我比 scanf 更好的选择吗??
  • @Pete:我一定错过了什么。为什么他的原始代码不能编译?
  • dappawit,由于试图在可执行代码中间分配 FILE *inputf,它无法编译。它必须位于顶部,在任何代码之前。
猜你喜欢
  • 2020-01-19
  • 1970-01-01
  • 1970-01-01
  • 2022-01-23
  • 2014-03-23
  • 1970-01-01
  • 1970-01-01
  • 2021-09-07
  • 1970-01-01
相关资源
最近更新 更多