1

私はファイル記述子を使用してファイルを読み取ろうとしています(これはおそらく私が行う必要があるよりもはるかに多くの作業ですが、それでも..)

arに似たアーカイバを作成しようとしています。読み取ろうとしている空でないファイルがありますが、readコマンドを実行して最初の8バイトを取得しようとすると、戻り値intは0になります。これは、バイトを読み取らなかったことを意味します。そして、errnoはすべてがうまくいったと私に言います。

私がやろうとしているのは、ファイルの先頭にある文字列を読み取って、文字列の比較を実行できるようにすることです。

スパゲッティコードについて申し訳ありませんが、私はまだテストを行っており、物事を理解しようとしています。

問題は、ステートメントtemp = read(archiveFD、buf、8);にあります。archiveFDは私のアーカイブファイルを指しています。このファイルは空ではありませんが、何も読み取られません。

指図:

./a.out r ar.c archive.a

アーク:

#include <stdio.h>
#include <string.h>
#include <fcntl.h>
#include <sys/stat.h>
#include <sys/types.h>
#include <utime.h>
#include <errno.h>
#define BUF_SIZE 1024

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

int fileFD, archiveFD, openFlags;
mode_t filePerms;
ssize_t numRead;
char buf[BUF_SIZE];
char fileName[16];
const struct utimbuf *times;
char modTime[12];
char entry[29];
int temp;
char *line = NULL;
size_t len = 0;

if(strcmp(argv[1], "r") != 0 && strcmp(argv[1], "x") != 0 && strcmp(argv[1], "d") != 0 && strcmp(argv[1], "t") != 0) {
    printf("%s","Not a valid command.\n");
    return 0;
}

if(strcmp(argv[1], "r") == 0) {
    if(argv[3] == NULL) {
        printf("%s","Missing arguments.\n");
        return 0;
    }

    fileFD = open(argv[2], O_RDONLY);
    if(fileFD == -1) {
        printf("%s","Error opening input file.\n");
        return 0;
    }

    openFlags = O_CREAT | O_RDWR | O_TRUNC;
    filePerms = S_IRUSR | S_IWUSR | S_IRGRP | S_IWGRP | S_IROTH | S_IWOTH;
    archiveFD = open(argv[3], openFlags, filePerms);
    if(archiveFD == -1) {
        printf("%s","Error opening archive file.\n");
        return 0;
    }

    temp = read(archiveFD,buf,8);
    //printf("%s",(char *) buf);
    //  if(strcmp("!<arch>\n",buf) != 0)
    //      write(archiveFD,"!<arch>\n",8); //begins archive
    //  printf("%s","here");
    //}
    printf("%d",temp);
    printf("%s",strerror(errno));
    //printf("%s",buf);

    sprintf(fileName,"%-16s",argv[2]);
    printf("%s",fileName);
    utime(argv[2],times);
    //strcpy(modTime,"12345678901234");
    //printf("%s",modTime);
    sprintf(modTime,"%-.12lld",(long long) times->modtime);
    modTime[12] = '\0';
    printf("%s",modTime);
    sprintf(entry,"%s%s\n",fileName,modTime);
    printf("%s",entry);

    write(archiveFD,entry,29);

    while((numRead = read(fileFD, buf, BUF_SIZE)) > 0)
        if(write(archiveFD, buf, numRead) != numRead) {
            printf("%s","Could not write whole buffer.\n");
            return 0;
        }
    if(numRead == -1) {
        printf("%s","Error reading.\n");
        return 0;
    }

    if(close(fileFD) == -1) {
        printf("%s","Error closing input file.\n");
        return 0;
    }
    if(close(archiveFD) == -1) {
        printf("%s","Error closing archive file.\n");
        return 0;
    }

}

return 0;
}`

archive.a:

ar.c            140737161196
#include <stdio.h>
#include <string.h>
#include <fcntl.h>
#include <sys/stat.h>
#include <sys/types.h>
#include <utime.h>
#include <errno.h>
#define BUF_SIZE 1024

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

int fileFD, archiveFD, openFlags;
mode_t filePerms;
ssize_t numRead;
char buf[BUF_SIZE];
char fileName[16];
const struct utimbuf *times;
char modTime[12];
char entry[29];
int temp;
char *line = NULL;
size_t len = 0;

if(strcmp(argv[1], "r") != 0 && strcmp(argv[1], "x") != 0 && strcmp(argv[1], "d") != 0 && strcmp(argv[1], "t") != 0) {
    printf("%s","Not a valid command.\n");
    return 0;
}

if(strcmp(argv[1], "r") == 0) {
    if(argv[3] == NULL) {
        printf("%s","Missing arguments.\n");
        return 0;
    }

    fileFD = open(argv[2], O_RDONLY);
    if(fileFD == -1) {
        printf("%s","Error opening input file.\n");
        return 0;
    }

    openFlags = O_CREAT | O_RDWR | O_TRUNC;
    filePerms = S_IRUSR | S_IWUSR | S_IRGRP | S_IWGRP | S_IROTH | S_IWOTH;
    archiveFD = open(argv[3], openFlags, filePerms);
    if(archiveFD == -1) {
        printf("%s","Error opening archive file.\n");
        return 0;
    }

    temp = read(archiveFD,buf,8);
    //printf("%s",(char *) buf);
    //  if(strcmp("!<arch>\n",buf) != 0)
    //      write(archiveFD,"!<arch>\n",8); //begins archive
    //  printf("%s","here");
    //}
    printf("%d",temp);
    printf("%s",strerror(errno));
    //printf("%s",buf);

    sprintf(fileName,"%-16s",argv[2]);
    printf("%s",fileName);
    utime(argv[2],times);
    //strcpy(modTime,"12345678901234");
    //printf("%s",modTime);
    sprintf(modTime,"%-.12lld",(long long) times->modtime);
    modTime[12] = '\0';
    printf("%s",modTime);
    sprintf(entry,"%s%s\n",fileName,modTime);
    printf("%s",entry);

    write(archiveFD,entry,29);

    while((numRead = read(fileFD, buf, BUF_SIZE)) > 0)
        if(write(archiveFD, buf, numRead) != numRead) {
            printf("%s","Could not write whole buffer.\n");
            return 0;
        }
    if(numRead == -1) {
        printf("%s","Error reading.\n");
        return 0;
    }

    if(close(fileFD) == -1) {
        printf("%s","Error closing input file.\n");
        return 0;
    }
    if(close(archiveFD) == -1) {
        printf("%s","Error closing archive file.\n");
        return 0;
    }

}

return 0;
}
4

1 に答える 1

1

このブロックでは:(簡潔にするためにエラーチェックは省略されています)

openFlags = O_CREAT | O_RDWR | O_TRUNC;
filePerms = S_IRUSR | S_IWUSR | S_IRGRP | S_IWGRP | S_IROTH | S_IWOTH;
archiveFD = open(argv[3], openFlags, filePerms);
temp = read(archiveFD,buf,8);

私は絶対にreadがゼロを返すことを期待します。でファイルを開いたばかりO_TRUNCなので、ファイルが空でなくても、開いた後です。既存のデータをすべて破棄したくない場合はO_TRUNC、openFlagsから削除してください。

于 2013-02-10T19:15:03.823 に答える