2013-02-10 2 views
1

내가 파일 기술자를 사용하여 파일 읽기 위해 노력하고있어 (아마 그럼에도 불구하고 많은 내가해야 할 필요 이상으로 작동하지만입니다 ..)읽기 0 바이트를 돌려줍니다

내가 유사한 아카이브를 만들려고 해요 아칸소. 나는 비어있는 파일을 가지고 있는데, 읽으려는 중이지만 처음 8 바이트를 검색하기 위해 read 명령을 시도 할 때 리턴 int는 0이다. 이것은 어떤 바이트도 읽지 않았다는 것을 의미한다. 그리고 errno는 모든 것이 잘되었다고 말해줍니다.

내가하려고하는 것은 문자열 비교를 실행할 수 있도록 파일의 시작 부분에서 문자열을 읽는 것입니다.

스파게티 코드에 대해 유감스럽게도 테스트를 계속하고 있습니다.

문제는 temp = read (archiveFD, buf, 8) 문에 있습니다. archiveFD는 내 아카이브 파일을 가리키며 비어 있지만 아무것도 읽지 않습니다.

명령

./a.out r에 ar.c

archive.a ar.c :

#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,"123456789"); 
    //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,"123456789"); 
    //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; 
} 
+1

이것은 너무 길어서 몇 사람이 읽습니다. 실제 문제를 격리하고 질문을 수정하십시오. 그냥 조언. –

+0

printf를 사용하여 오류를 인쇄하지 마십시오. 적어도, fprintf (stderr, ...')를 사용하는 것이 더 좋지만, if ((fileFD = open (path, flags) == -1) {perror (path); exit (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); 

나는 0을 반환 할 것을 절대적으로 기대합니다. O_TRUNC, 파일을 방금 열었습니다. 파일이 비어 있지 않은 경우에도 파일을 연 후에 나타납니다. 기존 데이터를 모두 삭제하지 않으려면 openFlags에서 O_TRUNC을 제거하십시오.

+0

감사합니다. 과제를 수행하는 데 충분한 시간이 없으므로 이해하지 못하고 세부 사항을 건너 뛰고 붙여 넣기하고 건너 뛰는 것이 쉽습니다. 감사합니다. – efiniti

관련 문제