2013-02-10 58 views
1

我試圖讀取使用文件描述符文件(這可能是更多的工作比我需要做的,但仍然..)讀返回0字節

我試圖建立類似的歸檔ar。我有一個非空文件,我試圖讀取,但是當我嘗試讀命令來檢索前8個字節時,返回int是0,這意味着它沒有讀取任何字節。而errno告訴我一切都很順利。

我想要做的是讀取字符串在文件的開頭,所以我可以運行字符串比較。

對不起關於意大利麪代碼,我仍在測試並試圖弄清楚。

問題出在聲明temp = read(archiveFD,buf,8); archiveFD指向我的存檔文件,該文件非空,但沒有讀取。

命令:

./a.outř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

這太長了,有幾個人會讀它..嘗試隔離實際問題並編輯您的問題。只是一個建議。 – 2013-02-10 19:13:38

+0

請勿使用printf打印錯誤。至少,使用'fprintf(stderr,...',但更好的辦法是:if((fileFD = open(path,flags)== -1){perror(path); exit(1); }' – 2013-02-10 19:22:03

回答

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); 

我絕對期望讀取返回零。您只需打開文件O_TRUNC, 即使該文件不是空的,也是在您打開它之後。如果您不想放棄所有現有數據,請從openFlags中刪除O_TRUNC

+0

謝謝,我沒有得到足夠的時間處理我的任務,因此,快速和馬虎的剪切和粘貼和跳過細節,而不理解他們.. 謝謝你親愛的 – efiniti 2013-02-10 19:20:13