2013-01-02 32 views
-1

如何讓程序讀取「partSize」字節數量並將其打印到屏幕上?假設我打開一個總共包含100個字符的文本文件。如果partSize是50字節,我希望50個字符被打印到屏幕上。C編程打印一定數量的字節到屏幕

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

#define PERMS 0777 

int main(int argc, char *argv[]) 
{ 
    int createDescriptor; 
    int openDescriptorOriginal; 
    int closeCreateDescriptor; 

    //char fileNameOriginal[] = "picture.jpg"; 
    char fileNameOriginal[] = "myFile.txt"; 

    int parts; 
    int partSize; 

    parts=2; 

    int bytesRemaining; 
    int partNumber; 
    char BUFFER[512]; 
    int readDescriptor; 

    if ((openDescriptorOriginal = open(fileNameOriginal, O_RDONLY)) == -1) 
    { 
     printf("Error opening %s", fileNameOriginal); 
     exit(EXIT_FAILURE); 
    } 

    struct stat buf; 
    int r = fstat(openDescriptorOriginal, &buf); 
    if (r) 
    { 
     fprintf(stderr, "error: fstat: %s\n", (char *) strerror(errno)); 
     exit(1); 
    } 

    int originalFileSize = buf.st_size; 
    printf("The file is %.9f Kilobytes large.\n", (double) originalFileSize/1024); 

    partSize = ((originalFileSize + parts) + 1)/parts; 

    //I am stuck at this part 
    while ((readDescriptor = read(openDescriptorOriginal, BUFFER, partSize)) < partSize)) 
    { 
     write(1, BUFFER, readDescriptor); 
    } 

    if ((closeCreateDescriptor = close(openDescriptorOriginal)) == -1) 
    { 
     printf("Error closing file.\n"); 
    } 

    return 0; 
} 
+0

您應該使用較小的標識符。 'openDescriptorOriginal'很快變得笨拙。 – cnicutar

+0

partSize是您期望的值嗎?你有沒有調試過你的程序?看來讀/寫位是正確的(儘管readDescriptor對於你使用它的內容是否有誤導性)。 –

+0

是的,partSize似乎是正確的值。 – John

回答

1

您需要檢查返回值,並更新長度在每次迭代:

ssize_t count, total; 
total = 0; 
char *buf = BUFFER; 
while (partSize) { 
    count = read(openDescriptorOriginal, buf, partSize); 
    if (count < 0) { 
     /* handle error */ 
     break; 
    } 
    if (count == 0) 
     break; 
    buf += count; 
    total += count; 
    partSize -= count; 
} 
write (1, BUFFER, total); 

total將包含讀取的字節數。