2013-09-25 15 views
1

我試圖帶入一個充滿4字節二進制整數的文件。我打開這個文件後試圖使用read(),但根本找不到這個功能。我無法弄清楚如何格式化我的代碼,我幾乎找不到這種特定類型的事情的代碼示例。我想讀取一個完整的整數的二進制文件,然後以ASCII格式打印每個整數。我也希望能夠在編寫我的代碼之前無需知道二進制int的確切數量就可以做到這一點。我一直在修改/嘗試的一些片段就是這樣的,但我無法弄清楚如何在循環中實現類似的東西。閱讀充滿整數的二進制文件,並以ASCII格式將其打印出來C

char *infile = argv[1]; 
int fd = open(infile, O_RDONLY); 

    int value; 
    int rc = read(fd, &value, sizeof(int)); 
    printf("%d", value); 

回答

2

read調用會給你回讀,所以你可以簡單地繼續下去,直到你得到比所要求的大小以外,一些字節數:

ssize_t rc = read (fd, &value, sizeof value); 
while (rc == sizeof value) { 
    printf ("%d\n", value); 
    rc = read (fd, &value, sizeof value); 
} 
if (rc == 0) { 
    printf ("End of file reached okay\n"); 
} else if (rc < 0) { 
    printf ("Some sort of error, errno = %d\n", errno); 
} else { 
    printf ("Only %d/%d bytes read\n", rc, sizeof value); 
} 

正如你所看到的,從read收到的最終價值決定發生了什麼。 -1指示某種錯誤,0指示已到達文件結尾,並且任何其他值(當然不是四個)意味着部分讀取,可能是因爲文件未正確創建。

您可能還想重新考慮使用低級I/O功能,如openread,除非您有非常特殊的需求,它們實際上不是ISO C標準的一部分,您可以實現同樣以fopenfread基於流的功能結束。

0

您應該檢查open的返回值,以及循環直到讀取不再返回數據。這可能是因爲文件結束,或者是由於錯誤。

int rc, value; 
while ((rc = = read (fd, &value, sizeof(int)) != sizeof(int)) 
    printf ("%d\n", value); 

if(rc == 0) 
{ 
    // ok 
} 
else if(rc < 0) 
{ 
    // error in errno. 
    perror ("Read returned the following error:"); // perror will print an appropriate error message from errno. 
} 
else 
{ 
    // file contains data which doesn't match up to a multiple of sizeof(int), so value may be undetermined here. 
} 
0

read函數返回了多少字節actualy閱讀,-1,如果錯誤發生,或者0,如果達到文件的末尾,這樣你就可以用它來閱讀所有整數即使你不知道那裏有多少。

因此,使用讀,你的代碼可能是這樣的:

char *infile = argv[1]; 
int fd = open(infile, O_RDONLY); 

int value; 
int rc; 
while ((rc = read(fd, &value, sizeof(int)) > 0) { 
    printf("%d\n", value); 
} 

使用的fopen/FREAD(推薦):從read

char *infile = argv[1]; 
FILE *fp = fopen(infile, "r"); 

int value; 
int rc; 
while ((rc = fread(&value, sizeof(int), 1, fp) > 0) { 
    printf("%d\n", value); 
} 

注意fread有一點不同的是,第二個參數是每個值的大小,第三個參數是要讀取多少個值。它將返回它實際讀取的數值(不是字節)(在這種情況下,當有值讀取時,它將爲1)。

另一件值得一提的事情是,你說你想讀取4個字節的值。 Int在大多數現代平臺中都是4字節,但沒有保證,如果你想確保它總是4字節,那麼包含標頭<stdint.h>並使用int32_t

相關問題