2013-04-16 30 views
5

我正在嘗試讀取同時寫入磁盤的文件。我需要閱讀特定大小的塊。如果讀取的大小小於特定的大小,我想讀取文件(類似ungetc所做的,而不是char []),然後重試。追加已讀的字節對我來說不是一種選擇。未讀的C++文件

這怎麼可能?

我試圖保存當前位置通過:

FILE *fd = fopen("test.txt","r+"); 
fpos_t position; 
fgetpos (fd, &position); 

,然後讀取文件,並把指針恢復到之前-FREAD位置。

numberOfBytes = fread(buff, sizeof(unsigned char), desiredSize, fd) 
if (numberByBytes < desiredSize) { 
    fsetpos (fd, &position); 
} 

但它似乎並沒有工作。

+3

C _or_ C++?選一個。 –

+0

@EtiennedeMartel,有時差異很重要 - 這是其中之一嗎?看起來不像我。 –

+0

@MarkRansom,* question *中的差異是否重要無關緊要,但在給出答案時很重要。 **高度**在回答時很重要。 – Griwes

回答

3

用我剛剛檢查過的代碼(Ubuntu 12.04 LTS,32位)替換了我以前的建議。海灣合作委員會是4.7,但我敢肯定這是100%的標準解決方案。

#include <stdio.h> 
#include <stdlib.h> 
#include <unistd.h> 

#define desiredSize 10 
#define desiredLimit 100 

int main() 
{ 
    FILE *fd = fopen("test.txt","r+"); 
    if (fd == NULL) 
    { 
     perror("open"); 
     exit(1); 
    } 

    int total = 0; 
    unsigned char buff[desiredSize]; 

    while (total < desiredLimit) 
    { 
     fpos_t position; 
     fgetpos (fd, &position); 

     int numberOfBytes = fread(buff, sizeof(unsigned char), desiredSize, fd); 
     printf("Read try: %d\n", numberOfBytes); 
     if (numberOfBytes < desiredSize) 
     { 
      fsetpos(fd, &position); 
      printf("Return\n"); 
      sleep(10); 
      continue; 
     } 
     total += numberOfBytes; 
     printf("Total: %d\n", total); 
    } 
    return 0; 
} 

我添加文本從另一個控制檯文件,是的,閱讀正在取得進展通過按照5個字符塊,我加入了什麼。

0

fseek似乎爲這個完美的:

FILE *fptr = fopen("test.txt","r+"); 
numberOfBytes = fread(buff, 1, desiredSize, fptr) 
if (numberOfBytes < desiredSize) { 
    fseek(fptr, -numberOfBytes, SEEK_CUR); 
} 

還要注意,文件描述符是什麼open的回報,而不是fopen