5

UNIX環境を使用するCプログラムを実行する必要があります。私はすでに「Unix環境でのプログラミングの進歩」という本を購入しましたが、これまでのところ非常に役立ちました。しかし、私の質問のいくつかは答えられず、私はいくつかの助けを探しています。

コピープログラムが存在する場合、最初と2番目の引数が入力されたかどうかを検証できるプログラムを作成しようとしています。最初の引数が存在しない場合は、エラーメッセージと終了が発生する必要があります。2番目の引数が存在する場合は、上書きプロンプトを表示する必要があります。基本的に、ファイルがすでに存在するかどうかを確認する方法が正確にはわかりません。

ファイルが存在する/存在しないことを確認するために(!-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 に答える