MATLAB Answers

textscan trouble: starting file position on re-read

4 views (last 30 days)
David C
David C on 19 Jun 2014
Edited: per isakson on 10 May 2015
I'm trying to read a data file of integers. The file is formatted as follows:
-112-999-999-999-555
-999-999
-777 0 0 0 0
0 20
-757 11 0 0 0
0 0
There are 3 blocks of 7 numbers each.
I tried
fid=fopen('filename.txt')
textscan(fid,'%4d',7)
And got the following as expected.
-112
-999
-999
-999
-555
-999
-999
But then I issue &nbsp textscan(fid,'%4d',7) &nbsp again. I would expect to get the second block this time, but instead I get:
2
-999
-999
-999
-555
-999
-999
It seems textscan started reading at the wrong place (not where it left off).
Any thoughts why it's doing this?
Thanks, David

  5 Comments

Show 2 older comments

Sign in to comment.

Answers (1)

Image Analyst
Image Analyst on 20 Jun 2014
In your second call to textscan() your first argument is fww. What is that? Why are you not using fid like in the first call to textscan()????

  9 Comments

Show 6 older comments
dpb
dpb on 20 Jun 2014
That's still a bug imo...the counted field should take care of it.
That it works with the file as formatted in earlier release (R2012b) is also indicative I think. textscan is terribly complicated and has several warts related to, especially, fixed-width field processing it seems. I've submitted a couple other bug reports in the past on similar parsing problems. Perhaps in trying to fix one of those, they introduced another...
This thing about C being so dysfunctional with fixed-width fields on formatted input is a real pain. Why K&R introduced some of these "features" is beyond ken, especially since the Fortran FORMAT example was already there as a much better model.
Stephen Cobeldick
Stephen Cobeldick on 10 Oct 2014
Tested with MATLAB R2012b. I downloaded your data file filename.txt, and ran the following code:
>> fid = fopen('filename.txt');
>> A(1) = textscan(fid,'%4d',7);
>> A(2) = textscan(fid,'%4d',7);
>> fclose(fid);
>> [A{:}]
ans =
-100 -106
-101 107
-102 108
-103 0
-555 0
-104 0
-105 20
This seems to give the outputs you want.
per isakson
per isakson on 10 May 2015
With 2014a
ans =
-100 0
-101 -101
-102 -102
-103 -103
-555 -555
-104 -104
-105 -105
was this ever reported?

Sign in to comment.


Translated by