5

我必须做一个使用 unix 环境的 C 程序。我已经购买了《Unix 环境中的高级编程》一书,到目前为止它已经帮了很多忙。但是,我的一些问题没有得到解答,我正在寻求帮助。

我正在尝试编写一个程序,如果存在复制程序,它可以验证是否输入了第一个和第二个参数。如果第一个参数不存在,则必须出现错误消息并退出。如果第二个参数确实存在,则必须显示覆盖提示。我不完全确定如何验证文件是否已经存在或不存在。

我见过一些人说您可以执行 (!-e) 或类似的操作来验证文件是否存在。

如果有人可以帮助我,我将不胜感激。

4

2 回答 2

8

access()函数旨在告诉您文件是否存在(或可读、可写或可执行)。

#include <unistd.h>
int result;
const char *filename = "/tmp/myfile";
result = access (filename, F_OK); // F_OK tests existence also (R_OK,W_OK,X_OK).
                                  //            for readable, writeable, executable
if ( result == 0 )
{
   printf("%s exists!!\n",filename);
}
else
{
   printf("ERROR: %s doesn't exist!\n",filename);
}
于 2012-09-06T14:18:13.667 回答
3

在你的int main(int argc, char** argv) {街区。

if (argc == 3) {
   // then there were 3 arguments, the program name, and two parameters
} else if (argc == 2) {
   // then prompt for the "second" argument, as the program name and one
   // parameter exists
} else {
   // just print out the usage, as we have a non-handled number of arguments
}

现在,如果您想验证文件是否存在,这与验证程序参数是否存在不同。基本上尝试打开文件并从中读取,但要密切注意捕获整数错误代码并检查它们是否有错误。这将防止您的程序进展到假设那些关键操作已经工作的位。

新程序员在用 C 语言处理文件时,有一个常见但被误导的概念。基本上,一个人真的想确保特定的代码块有效(在你的情况下是复制块),所以他们检查、检查和加倍- 在执行块之前检查条件。检查文件是否存在,检查它是否具有正确的权限,检查它是否不是目录等。我的建议是你要这样做。

您的复制块应该能够正常失败,就像它应该能够成功一样正常。如果它失败,那么通常您拥有打印出有意义的错误消息所需的所有信息。如果您先检查然后采取行动,那么在检查和行动之间总会有一个小的时间间隔,并且这个时间间隔最终会在检查通过之后看到文件被删除或更改,但在读取之前。在这种情况下,所有预检查代码都无法提供任何好处。

没有好处的代码只是未来错误和架构问题的一个窝点。不要浪费时间编写具有可疑(或没有)好处的代码。当您怀疑您编写的某些代码没有什么好处时,您需要重组代码以将其放在正确的位置。当你怀疑别人写的代码没有什么好处时,你首先需要怀疑你的怀疑。很容易看不到一段代码背后的动机,在刚开始使用一种新语言时更是如此。

祝你好运!

---疲惫的代码---

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

extern int errno;

int main(int argc, char** argv) {

   // to hold our file descriptor
   FILE *fp;

   // reset any possible previously captured errors
   errno = 0;

   // open the file for reading
   fp = fopen(argv[1], "r");

   // check for an error condition
   if ( fp == 0 && errno != 0 ) {

     // print the error condition using the system error messages, with the
     // additional message "Error occurred while opening file"
     perror("Error occurred while opening file.\n");

     // terminate the program with a non-successful status
     exit(1);

   }

}
于 2012-09-06T14:01:34.087 回答