2013-04-16 57 views
5

Tôi đang cố đọc các tệp được ghi đồng thời vào đĩa. Tôi cần phải đọc các khối có kích thước cụ thể. Nếu kích thước đọc nhỏ hơn kích thước cụ thể, tôi muốn chưa đọc tệp (giống như những gì ungetc làm, thay vì một char []) và thử lại. Phụ thêm vào các byte đã đọc không phải là một lựa chọn cho tôi.chưa đọc một tệp trong C++

Làm cách nào có thể?

tôi đã cố gắng tiết kiệm vị trí hiện tại thông qua:

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

và sau đó đọc các tập tin và đưa con trỏ trở lại vị trí trước-fread của nó.

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

Nhưng có vẻ như nó không hoạt động.

+3

C _or_ C++? Chọn một. –

+0

@EtiennedeMartel, có những lúc sự khác biệt quan trọng - đây có phải là một trong số đó không? Không giống như tôi. –

+0

@MarkRansom, nó không quan trọng cho dù sự khác biệt trong * câu hỏi * vấn đề - nhưng nó quan trọng khi đưa ra câu trả lời. ** Cao ** vấn đề khi đưa ra câu trả lời. – Griwes

Trả lời

3

Thay thế các đề xuất trước đó bằng mã tôi vừa kiểm tra (Ubuntu 12.04 LTS, 32bit). GCC là 4.7 nhưng tôi khá chắc chắn đây là giải pháp tiêu chuẩn 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; 
} 

Tôi đã thêm văn bản vào tệp từ bảng điều khiển khác và có, đã đọc được tiến hành bởi 5 khối ký tự theo những gì tôi đã thêm.

0

fseek dường như hoàn hảo cho việc này:

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

Cũng lưu ý rằng một bộ mô tả tập tin là gì open lợi nhuận, không fopen.