Esempio n. 1
0
int GenericFile_stdio::advance(long long offset)
{
    return _fseek64bit(_file, offset, SEEK_CUR);
}
Esempio n. 2
0
    const Genome *
Genome::loadFromFile(const char *fileName, unsigned i_minOffset, unsigned length)
{    
    FILE *loadFile;
    unsigned nBases,nPieces;

    if (!openFileAndGetSizes(fileName,&loadFile,&nBases,&nPieces)) {
        //
        // It already printed an error.  Just fail.
        //
        return NULL;
    }

    if (0 == length) {
        length = nBases - i_minOffset;
    } else {
        //
        // Don't let length go beyond nBases.
        //
        length = __min(length,nBases - i_minOffset);
    }

    Genome *genome = new Genome(nBases,length);
   
    genome->nBases = nBases;
    genome->nPieces = genome->maxPieces = nPieces;
    genome->pieces = new Piece[nPieces];
    genome->minOffset = i_minOffset;
    if (i_minOffset >= nBases) {
        fprintf(stderr,"Genome::loadFromFile: specified minOffset %u >= nBases %u\n",i_minOffset,nBases);
    }

 

    genome->maxOffset = i_minOffset + length;

    static const unsigned pieceNameBufferSize = 512;
    char pieceNameBuffer[pieceNameBufferSize];
    unsigned n;
    size_t pieceSize;
    char *curName;
    for (unsigned i = 0; i < nPieces; i++) {
        if (NULL == fgets(pieceNameBuffer, pieceNameBufferSize, loadFile)){
	  
	  fprintf(stderr,"Unable to read piece description\n");
            delete genome;
            return NULL;
        }

	for (n = 0; n < pieceNameBufferSize; n++){
	  if (pieceNameBuffer[n] == ' ') {
	    pieceNameBuffer[n] = '\0'; 
	    break;
	  }
	}

    genome->pieces[i].beginningOffset = atoi(pieceNameBuffer);
	pieceNameBuffer[n] = ' '; 
	n++; // increment n so we start copying at the position after the space
	pieceSize = strlen(pieceNameBuffer + n) - 1; //don't include the final \n
        genome->pieces[i].name = new char[pieceSize + 1];
	curName = genome->pieces[i].name;
	for (unsigned pos = 0; pos < pieceSize; pos++) {
	  curName[pos] = pieceNameBuffer[pos + n];
	}
        curName[pieceSize] = '\0';
    }

    //
    // Skip over the miserable \n that gets left in the file.
    //
    /*  char newline;
    if (1 != fread(&newline,1,1,loadFile)) {
        fprintf(stderr,"Genome::loadFromFile: Unable to read expected newline\n");
        delete genome;
        return NULL;
    }

    if (newline != 10) {
        fprintf(stderr,"Genome::loadFromFile: Expected newline to be 0x0a, got 0x%02x\n",newline);
        delete genome;
        return NULL;
    }
    */

    if (0 != _fseek64bit(loadFile,i_minOffset,SEEK_CUR)) {
        fprintf(stderr,"Genome::loadFromFile: _fseek64bit failed\n");
        exit(1);
    }

    if (length != fread(genome->bases,1,length,loadFile)) {
        fprintf(stderr,"Genome::loadFromFile: fread of bases failed\n");
        fclose(loadFile);
        delete genome;
        return NULL;
    }

    fclose(loadFile);
    return genome;
}