2013-04-16 3 views
5

में एक फ़ाइल को अपठित करें, मैं उन फ़ाइलों को पढ़ने की कोशिश कर रहा हूं जो डिस्क पर एक साथ लिखे गए हैं। मुझे विशिष्ट आकार के टुकड़े पढ़ने की जरूरत है। यदि आकार पढ़ा गया विशिष्ट आकार से कम है, तो मैं फ़ाइल को अपठित करना चाहता हूं (कुछ ऐसा जो कुछ नहीं करता है, बजाय char [] के लिए) और पुनः प्रयास करें। बाइट्स को पहले से पढ़ना मेरे लिए एक विकल्प नहीं है।सी ++

यह कैसे संभव है?

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

सी _or_ सी ++? एक चुनें। –

+0

@EtiennedeMartel, ऐसे समय होते हैं जब मतभेद मायने रखते हैं - क्या उनमें से एक है? यह मेरे जैसा नहीं दिखता है। –

+0

@ मार्ककंसॉम, इससे कोई फर्क नहीं पड़ता कि * प्रश्न * मामलों में अंतर - लेकिन जवाब देने पर यह महत्वपूर्ण है। ** उत्तर देने पर अत्यधिक ** मायने रखता है। – Griwes

उत्तर

3

मेरे पिछले सुझावों को कोड के साथ बदलकर मैंने अभी चेक किया है (उबंटू 12.04 एलटीएस, 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