1

したがって、これは私がこれまでに作成したエラーチェックを使用した最初のプログラムの1つですが、何らかの理由でこれをコンパイルして実行すると、次のようになります。

./file test1.txt test2.txt 10

出力ファイルが存在することを示唆するエラーが絶対に発生し、ファイルを確認しましたが、出力ファイルの名前を変更しても(2番目の引数)何も表示されません。助けることができる人はいますか?私は何年もの間頭を悩ませてきました。これは、私がGentooでコンパイルして実行しているUNIXの宿題です。VBで実行していて、WindowsとLinuxOSの間にリンクされたフォルダーがあります。

#include <stdio.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <stdlib.h>

#define BUFFT 25

int main (int argc, char *argv[])
{
  int count;
  int readin;
  int writeout;

  printf ("This program was called  \"%s\".\n",argv[0]);

  if (argc > 1)
    {
      for (count = 1; count < argc; count++)
    {
      printf("argv[%d] = %s\n", count, argv[count]);
    }
    }
  else
    {
      perror("The command had no arguments.\n");
      exit(-1);

    }
    // check correct number of arguments parsed //


    if  (argc == 4)
    {
        printf("There are the correct number of arguments(4)\n");

        }
        else
        {
            perror("Not enough arguments! please try again \n");
            exit(-1);
            }
    //Check original file is there//

    int openFD = open(argv[1], O_RDWR);
    if (openFD <0)
    {
        perror("Error unable to read file \n");
        exit(-1);
    }

    //Check existence of output file, if it doesn't exist create it//

    int CheckFile = open(argv[2], O_RDONLY);
    if (CheckFile < 0)
    {
        perror("Error output file already exists \n");
        exit(-1);
        }
     else
     {
     int CheckFile = open(argv[2], O_CREAT);
     printf("The file has successfully been created \n");
     }

    //Create buffer

    int bufsize = atoi(argv[3]);
    char *calbuf;
    calbuf = calloc(bufsize, sizeof(char));

    //Read text from original file and print to output//

    readin = read(openFD, calbuf, BUFFT);
    if (readin < 0){
        perror("File read error");
        exit(-1);
    }
    writeout = write(openFD,bufsize,readin);
    if (writeout <0){
        perror("File write error");
        exit(-1);
    }


  return 0;
}
4

3 に答える 3

1

HANDLE CheckFile公募は、 ErrorFileExistsを出力しています。これがあなたの問題です。出力ファイルが見つからないときに間違ったステートメントを出力し、さらに終了しているため、コードでステートメントを作成できません。

int CheckFile = open(argv[2], O_RDONLY);
if (CheckFile < 0)
{
    //Means the file doesn't exist
    int CheckFile = open(argv[2], O_CREAT);
    // Check for errors  here
}

そして、なぜあなたはこれをやろうとしているのですか::

writeout = write(openFD,bufsize,readin);

出力ファイルへのハンドルがCheckFileの場合

于 2012-09-21T05:51:21.597 に答える
1
    int CheckFile = open(argv[2], O_RDONLY);
    if (CheckFile < 0)
    {
        perror("Error output file already exists \n");

からの負の戻り値openは、ファイルを開くことができなかったことを意味します。おそらく、ファイルが存在しないためです...ファイルがすでに存在することを意味するわけではありません。入力ファイルを開かなくても、出力ファイルがすでに存在しているとは限りません。明らかなエラーがないか、コードをより注意深くチェックしてください。

int CheckFile = open(argv[2], O_CREAT);
printf("The file has successfully been created \n");

ここでは、リターンコードを確認しません。

于 2012-09-21T05:38:24.853 に答える
1

コードのこのフラグメントを見てください。

int CheckFile = open(argv[2], O_RDONLY);
if (CheckFile < 0)
{
    perror("Error output file already exists \n");
    exit(-1);
}

読み取り専用モードでファイルを開こうとしていると言っています。私があなたの質問で読んだことから、ファイルが存在しない場合はエラーではありませんが、反対のことを検証しているコードでは、ファイルが存在しない場合はエラーをスローします(実際、メッセージエラーはここでは正しくありません)。

ロジックを再確認すると、解決策が見つかります。

于 2012-09-21T05:39:20.097 に答える