2013-04-16 2 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, неважно, имеет значение различие в * вопросе *, но это имеет значение, когда вы даете ответы. ** Очень важно, когда вы даете ответы. – Griwes

ответ

3

Замена моих предыдущих предложений кодом, который я только что проверил (Ubuntu 12.04 LTS, 32bit). GCC - 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.

Смежные вопросы