1

我需要避免错误的输入/输出文件名以及无效的参数。我也使用过类似的东西,但它并没有真正帮助:

while ((c = getopt(argc, argv, "i:o:")) != -1) {
        switch (c) {


             case 'i':
                      inFile = strdup(optarg);
             break;
             case 'o':
                      outFile = strdup(optarg);
             break;
             default:
                      //usage(argv[0]);
                      break;
    }
}

      if ((ptr1 = fopen(inFile, "r+")) == NULL) {
            fprintf(stderr, "Error: cannot open file %s\n", inFile);
            exit(-1);
    }
    if ((ptr = fopen(outFile, "w+")) == NULL) {
            fprintf(stderr, "Error: cannot open file %s\n", outFile);
            exit(-1);
    }

测试我的程序的python程序如下:

class Arg2(Test):
   name = "arg2"
   description = "bad arguments"
   timeout = 5
   def run(self):
      self.runexe(["fastsort", "a", "b", "c", "d"],
            stderr = usage_error, status = 1)
      self.done()

class Badin(Test):
   name = "badin"
   description = "bad input file"
   timeout = 5
   def run(self):
      invalid = mktemp(prefix='/invalid/path/')
      self.runexe(["fastsort", "-i", invalid, "-o", "outfile"],
          stderr = "Error: Cannot open file {0}\n".format(invalid), status = 1)
      self.done()

class Badout(Test):
   name = "badout"
   description = "bad output file"
   timeout = 5
   def run(self):
      infile = self.project_path + "/infile"
      # create a valid (empty) input file
      open(infile, "a").close()
      invalid = mktemp(prefix='/invalid/path/')
      self.runexe(["fastsort", "-i", infile, "-o", invalid],
          stderr = "Error: Cannot open file {0}\n".format(invalid), status = 1)
      self.done()

您能否给我一些提示和代码片段来避免错误文件名/错误文件路径以及 C 中的无效参数处理的常用方法?

4

1 回答 1

1

假设“错误的文件名”和“错误的路径名”是指由于文件名或路径名有问题而无法打开的路径,那么您解决此问题的一般方法是正确的:尝试fopen,并在事后报告错误,而不是试图猜测它是否会起作用。

您缺少的是检查errno失败。而不是这个通用错误:

fprintf(stderr, "Error: cannot open file %s\n", inFile);

errno... 使用,strerror或打印出特定的内容perror

fprintf(stderr, "Error: cannot open file ");
perror(inFile);

然后你会得到类似的东西:

Error: cannot open file foo/bar: No such file or directory.

如果您想以编程方式区分错误,只需检查errno

if (errno == ENOENT) {
    /* The directory, or one of its parents, doesn't exist, so handle that */
} else {
    /* whatever */
}

另一方面,如果您想将信息传递回调用程序,只需errno作为您的 retcode 返回:

exit(errno)

这不是典型的事情——但exit(-1)也不是。通常你使用1“通用故障”,-1 用于“我退出,因为我捕捉到了信号 1”。


同时,不清楚您所说的“错误文件名”和“错误路径名”是什么意思,但似乎所有这些都算数:

  • 路径的文件名部分太长。errno将是 ENAMETOOLONG。
  • 整个路径名太长。errno将是 ENAMETOOLONG。
  • 指定的目录或沿链指定的父目录之一不存在。errnoENOENT
  • 指定的目录或父目录之一不是目录。errnoENOTDIR
  • 路径名中的无效字符。在 POSIX 中没有这样的事情,所以这只会发生在像 Windows 这样的非 POSIX 平台上,这些平台通常不会定义调用 C 和 POSIX 函数会返回什么错误。(如果你真的想处理 Windows 错误,你可能想使用CreateFile而不是fopen等)

如果您需要在 Windows 或其他平台上处理最后一种情况,最好的办法是对其进行测试:尝试fopen("a b \\?*:; \n \003", "w+")看看您得到了什么。然后你就会知道在你的代码中放什么。

于 2013-09-16T22:49:50.007 回答