本文整理汇总了C++中DataSource::DataSourceFread方法的典型用法代码示例。如果您正苦于以下问题:C++ DataSource::DataSourceFread方法的具体用法?C++ DataSource::DataSourceFread怎么用?C++ DataSource::DataSourceFread使用的例子?那么, 这里精选的方法代码示例或许可以为您提供帮助。您也可以进一步了解该方法所在类DataSource
的用法示例。
在下文中一共展示了DataSource::DataSourceFread方法的4个代码示例,这些例子默认根据受欢迎程度排序。您可以为喜欢或者感觉有用的代码点赞,您的评价将有助于系统推荐出更棒的C++代码示例。
示例1: errSprintf
/*****************************************************************************
* GRIB2SectToBuffer() -- Review 12/2002
*
* Arthur Taylor / MDL
*
* PURPOSE
* To read in a GRIB2 section into a buffer. Reallocates space for the
* section if buffLen < secLen. Reads in secLen and checks that the section
* is valid, and the file is large enough to hold the entire section.
*
* ARGUMENTS
* fp = Opened file pointing to the section in question. (Input/Output)
* gribLen = The total length of the grib message. (Input)
* sect = Which section we think we are reading.
* If it is -1, then set it to the section the file says we are
* reading (useful for optional sect 2)) (Input/Output).
* secLen = The length of this section (Output)
* buffLen = Allocated length of buff (Input/Output)
* buff = Stores the section (Output)
*
* FILES/DATABASES:
* An already opened GRIB2 file pointer, already at section in question.
*
* RETURNS: int (could use errSprintf())
* 0 = Ok.
* -1 = Ran out of file.
* -2 = Section was miss-labeled.
*
* HISTORY
* 11/2002 Arthur Taylor (MDL/RSIS): Created.
* 12/2002 (TK,AC,TB,&MS): Code Review.
* 8/2003 AAT: Removed dependence on curTot
*
* NOTES
* May want to put this in degrib2.c
*****************************************************************************
*/
static int GRIB2SectToBuffer (DataSource &fp,
CPL_UNUSED uInt4 gribLen,
sChar *sect,
uInt4 *secLen, uInt4 *buffLen, char **buff)
{
char *buffer = *buff; /* Local ptr to buff to reduce ptr confusion. */
if (FREAD_BIG (secLen, sizeof (sInt4), 1, fp) != 1) {
if (*sect != -1) {
errSprintf ("ERROR: Ran out of file in Section %d\n", *sect);
} else {
errSprintf ("ERROR: Ran out of file in GRIB2SectToBuffer\n");
}
return -1;
}
if( *secLen < sizeof(sInt4) )
{
errSprintf ("ERROR: Wrong secLen in GRIB2SectToBuffer\n");
return -1;
}
if (*buffLen < *secLen) {
char* buffnew = (char *) realloc ((void *) *buff, *secLen * sizeof (char));
if( buffnew == NULL )
{
errSprintf ("ERROR: Ran out of memory in GRIB2SectToBuffer\n");
return -1;
}
*buffLen = *secLen;
*buff = buffnew;
buffer = *buff;
}
if (fp.DataSourceFread (buffer, sizeof (char), *secLen - sizeof (sInt4)) !=
*secLen - sizeof (sInt4)) {
if (*sect != -1) {
errSprintf ("ERROR: Ran out of file in Section %d\n", *sect);
} else {
errSprintf ("ERROR: Ran out of file in GRIB2SectToBuffer\n");
}
return -1;
}
if (*sect == -1) {
*sect = buffer[5 - 5];
} else if (buffer[5 - 5] != *sect) {
errSprintf ("ERROR: Section %d mislabeled\n", *sect);
return -2;
}
return 0;
}
示例2: GRIB2Inventory
//.........这里部分代码省略.........
free (buff);
//fclose (fp);
return -4;
}
/* Parse the interesting data out of sect 1. */
InventoryParseTime (buffer + 13 - 5, &(inv->refTime));
MEMCPY_BIG (¢er, buffer + 6 - 5, sizeof (short int));
MEMCPY_BIG (&subcenter, buffer + 8 - 5, sizeof (short int));
sectNum = 2;
do {
/* Look at sections 2 to 7 */
if ((ans = GRIB2Inventory2to7 (sectNum, fp, gribLen, &bufferLen,
&buffer, inv, prodType, center,
subcenter)) != 0) {
//fclose (fp);
free (buffer);
free (buff);
return ans;
}
/* Try to read section 8. If it is "7777" = 926365495 regardless
* of endian'ness then we have a simple message, otherwise it is
* complex, and we need to read more. */
if (FREAD_BIG (&secLen, sizeof (sInt4), 1, fp) != 1) {
errSprintf ("ERROR: Ran out of file looking for Sect 8.\n");
free (buffer);
free (buff);
// fclose (fp);
return -4;
}
if (secLen == 926365495L) {
sectNum = 8;
} else {
if (fp.DataSourceFread (§Num, sizeof (char), 1) != 1) {
errSprintf ("ERROR: Ran out of file looking for "
"subMessage.\n");
free (buffer);
free (buff);
//fclose (fp);
return -4;
}
if ((sectNum < 2) || (sectNum > 7)) {
errSprintf ("ERROR (GRIB2Inventory): Couldn't find the end"
" of message\n");
errSprintf ("and it doesn't appear to repeat sections.\n");
errSprintf ("so it is probably an ASCII / binary bug\n");
free (buffer);
free (buff);
//fclose (fp);
return -4;
}
fp.DataSourceFseek (-5, SEEK_CUR);
/* Make room for the next part of this GRIB message in the
* inventory list. This is for when we have sub-grids. */
*LenInv = *LenInv + 1;
*Inv = (inventoryType *) realloc ((void *) *Inv,
*LenInv *
sizeof (inventoryType));
inv = *Inv + (*LenInv - 1);
lastInv = *Inv + (*LenInv - 2);
inv->GribVersion = version;
inv->msgNum = msgNum;
inv->subgNum = lastInv->subgNum + 1;
inv->start = offset;
inv->element = NULL;
示例3: ReadGrib2Record
//.........这里部分代码省略.........
return -1;
}
*f_endMsg = 1;
free (buff);
return 0;
} else if (version == -1) {
if (ReadTDLPRecord (fp, Grib_Data, grib_DataLen, meta, IS,
sect0, gribLen, majEarth, minEarth) != 0) {
preErrSprintf ("Problems with ReadGrib1Record called by "
"ReadGrib2Record\n");
free (buff);
return -1;
}
free (buff);
return 0;
}
/*
* Make room for entire message, and read it in.
*/
/* nd5 needs to be gribLen in (sInt4) units rounded up. */
nd5 = (gribLen + 3) / 4;
if (nd5 > IS->ipackLen) {
IS->ipackLen = nd5;
IS->ipack = (sInt4 *) realloc ((void *) (IS->ipack),
(IS->ipackLen) * sizeof (sInt4));
}
c_ipack = (char *) IS->ipack;
/* Init last sInt4 to 0, to make sure that the padded bytes are 0. */
IS->ipack[nd5 - 1] = 0;
/* Init first 4 sInt4 to sect0. */
memcpy (c_ipack, sect0, SECT0LEN_WORD * 4);
/* Read in the rest of the message. */
if (fp.DataSourceFread (c_ipack + SECT0LEN_WORD * 4, sizeof (char),
(gribLen - SECT0LEN_WORD * 4)) != (gribLen - SECT0LEN_WORD * 4)) {
errSprintf ("GribLen = %ld, SECT0Len_WORD = %d\n", gribLen,
SECT0LEN_WORD);
errSprintf ("Ran out of file\n");
free (buff);
return -1;
}
/*
* Make sure the arrays are large enough for call to unpacker library.
*/
/* FindSectLen Does not want (ipack / c_ipack) word swapped, because
* that would make it much more confusing to find bytes in c_ipack. */
if (FindSectLen (c_ipack, gribLen, local_ns, &nd2x3, &table50) < 0) {
preErrSprintf ("Inside ReadGrib2Record.. Calling FindSectLen\n");
free (buff);
return -2;
}
/* Make sure all 'is' arrays except ns[7] are MAX (IS.ns[] ,
* local_ns[]). See note 1 for reason to exclude ns[7] from MAX (). */
for (i = 0; i < 7; i++) {
if (local_ns[i] > IS->ns[i]) {
IS->ns[i] = local_ns[i];
IS->is[i] = (sInt4 *) realloc ((void *) (IS->is[i]),
IS->ns[i] * sizeof (sInt4));
}
}
/* Allocate room for sect 2. If local_ns[2] = -1 there is no sect 2. */
if (local_ns[2] == -1) {
nidat = 10;
示例4: ReadSECT0
//.........这里部分代码省略.........
* 1c) 1413762128L == ASCII representation of "TDLP" (TDLP in MSB)
* 1d) 1347175508L == ASCII representation of "PLDT" (TDLP in LSB)
* 2) Takes advantage of the wordType to check that the edition is correct.
* 3) May want to return prodType.
* 4) WMO_HEADER_ORIG_LEN was added for backward compatibility... should be
* removed when we no longer use old format. (say in a year from 11/2002)
*
*****************************************************************************
*/
int ReadSECT0 (DataSource &fp, char **buff, uInt4 *buffLen, sInt4 limit,
sInt4 sect0[SECT0LEN_WORD], uInt4 *gribLen, int *version)
{
typedef union {
sInt4 li;
unsigned char buffer[4];
} wordType;
uChar gribMatch = 0; /* Counts how many letters in GRIB we've matched. */
uChar tdlpMatch = 0; /* Counts how many letters in TDLP we've matched. */
wordType word; /* Used to check that the edition is correct. */
uInt4 curLen; /* Where we currently are in buff. */
uInt4 i; /* Used to loop over the first few char's */
uInt4 stillNeed; /* Number of bytes still needed to get 1st 8 bytes of
* message into memory. */
/* Get first 8 bytes. If GRIB we don't care. If TDLP, this is the length
* of record. Read at least 1 record (length + 2 * 8) + 8 (next record
* length) + 8 bytes before giving up. */
curLen = 8;
if (*buffLen < curLen) {
*buffLen = curLen;
*buff = (char *) realloc ((void *) *buff, *buffLen * sizeof (char));
}
if (fp.DataSourceFread(*buff, sizeof (char), curLen) != curLen) {
errSprintf ("ERROR: Couldn't find 'GRIB' or 'TDLP'\n");
return -1;
}
/*
Can't do the following because we don't know if the file is a GRIB file or
not, or if it was a FORTRAN file.
if (limit > 0) {
MEMCPY_BIG (&recLen, *buff, 4);
limit = (limit > recLen + 32) ? limit : recLen + 32;
}
*/
while ((tdlpMatch != 4) && (gribMatch != 4)) {
for (i = curLen - 8; i + 3 < curLen; i++) {
if ((*buff)[i] == 'G') {
if (((*buff)[i + 1] == 'R') && ((*buff)[i + 2] == 'I') &&
((*buff)[i + 3] == 'B')) {
gribMatch = 4;
break;
}
} else if ((*buff)[i] == 'T') {
if (((*buff)[i + 1] == 'D') && ((*buff)[i + 2] == 'L') &&
((*buff)[i + 3] == 'P')) {
tdlpMatch = 4;
break;
}
}
}
stillNeed = i - (curLen - 8);
/* Read enough of message to have the first 8 bytes (including ID). */
if (stillNeed != 0) {
curLen += stillNeed;
if ((limit >= 0) && (curLen > (size_t) limit)) {