Ticket #1685 (new defect)

Opened 11 months ago

Last modified 11 months ago

r.in.ascii -s for SURFER does not work in grass7

Reported by: helena Owned by: grass-dev@…
Priority: minor Milestone: 7.0.0
Component: Raster Version: svn-trunk
Keywords: raster import, Surfer, r.in.ascii Cc:
Platform: All CPU: OSX/Intel

Description

r.in.ascii -s for SURFER gives ERROR: Unable to seek in GRASS7

same file can be imported using r.in.gdal

should we keep the -s flag in r.in.ascii and fix the bug or leave r.in.ascii for GRASS ascii rasters only?

Helena

Attachments

r.in.ascii.patch Download (418 bytes) - added by mmetz 11 months ago.
r.in.ascii fseek patch for trunk

Change History

follow-up: ↓ 2   Changed 11 months ago by hamish

  • keywords Surfer, r.in.ascii added; Surfer removed
  • platform changed from MacOSX to All

the error message in g7 lib/gis/seek.c is now just "Unable to seek"; it's not a fundamental limitation just a regular bug AFAICT.

I found a binary Surfer6 grid file sitting on an old drive, and could convert it to an ascii grid:

  gdal_translate -of GSAG helens2.grd helens2a.grd
  r.in.ascii -s in=helens2a.grd out=helens2

and I can reproduce your error. It happens in r.in.ascii/main.c on this G_fseek(), while processing the last row of the map.

    for (row = 0; row < nrows; row += 1) {
	fread(rast, Rast_cell_size(data_type), ncols, ft);
	Rast_put_row(cf, rast, data_type);
	G_fseek(ft, sz, SEEK_CUR);
    }
    fclose(ft);
    unlink(temp);

    Rast_close(cf);

G_ftell(ft) reports the position as 1308 but G_fseek() wants to move sz=-2616 bytes (negative as surfer ascii grids are stored bottom to top), and runs past the end (i.e. start) of the file. note 1308*2 = 2616. I presume the array is off by 1 row and the first line of data is either repeated or empty.

here is row, nrows, sz, and on the newline G_ftell() position for the last few rows:

460 466  -2616
7848
461 466  -2616
6540
462 466  -2616
5232
463 466  -2616
3924
464 466  -2616
2616
465 466  -2616
1308
ERROR: Unable to seek

The import works fine in grass 6.x.

Hamish

Changed 11 months ago by mmetz

r.in.ascii fseek patch for trunk

in reply to: ↑ 1   Changed 11 months ago by mmetz

Replying to hamish:

the error message in g7 lib/gis/seek.c is now just "Unable to seek"; it's not a fundamental limitation just a regular bug AFAICT.

In GRASS 6.x, r.in.ascii would have the same bug if it would check the return value of fseek() (it might be a good idea to check the return value of fread() as well). The attached fix is simply to not fseek after the last row has been read from the input file, that must fail if direction < 0. For sz == 0, fseek from SEEK_CUR has no effect anyway.

Markus M

Note: See TracTickets for help on using tickets.