Dimensioning a field within a structure array for reading data

조회 수: 5 (최근 30일)
Jim McIntyre
Jim McIntyre 2025년 8월 15일
편집: Star Strider 2025년 8월 18일
I am reading a file that contains a number of groups of fields and I'm trying to figure out how to do this.
I'd like to create structure (CTW) where I will group the data, but I'm running into problems defining and allocating the fields.
The first set of data in the file is an array of four variables of 8 characters each. I want to call these c8(1), through c8(4).
The second set of data in the file is 6 variables of 20 characters each. I want to call these c20(1), through c20(6).
Currently, my code looks like this:
fid = fopen(filename, 'r');
for x = 1 : 4
CTW.c8(x) = string(fread(fid, 8, '*char')');
end
for x = 1 : 6
CTW.c20(x) = string(fread(fid, 20, '*char')');
end
Matlab gives the following error:
Unable to perform assignment because the indices on the left side are not compatible with the size of the right side.
I know that I can read in the individual strings and then create the structure, like this:
c81 = string(fread(fid, 8, '*char')');
c82 = string(fread(fid, 8, '*char')');
c83 = string(fread(fid, 8, '*char')');
c84 = string(fread(fid, 8, '*char')');
CTW.c8 = [c81, c82, c83, c84];
clear c81 c82 c83 c84
end
but that seems inelegant. What is the best way to do this? Is there some way to pre-allocate the arrays within the structure?
  댓글 수: 1
Jim McIntyre
Jim McIntyre 2025년 8월 18일
It appears that I can make this work in a slightly cumbersome way by predefining each set of variables like this:
fid = fopen(filename, 'r');
numFields = 4;
CTW.c8 = strings(numFields, 1);
for x = 1 : numFields
CTW.c8(x) = string(fread(fid, 8, '*char')');
end
numFields = 6;
CTW.c20 = strings(numFields, 1);
for x = 1 : numFields
CTW.c20(x) = fread(fid, 20, '*char');
end
I still suspect there's a better way to do this.

댓글을 달려면 로그인하십시오.

채택된 답변

Star Strider
Star Strider 2025년 8월 15일
편집: Star Strider 2025년 8월 18일
It might be worthwhile to use the readcell function to read it.
After that, the cell2struct function could work to create a structure from it with the characteristics you want.
I am not certain how easy that might be. I have used both of these funcitons (although rarely), however I have never done what you describe.
EDIT -- (18 ,Aug 2025 at 12:07)
One way to troubleshoot this would be to read the lines in separately to see what the problem is, and then make the appropriate changes to your code.
Example --
fid = fopen(filename, 'r');
for x = 1 : 4
c8str = string(fread(fid, 8, '*char')')
CTW.c8(x) = string(fread(fid, 8, '*char')');
end
for x = 1 : 6
c20str = string(fread(fid, 20, '*char')')
CTW.c20(x) = string(fread(fid, 20, '*char')');
end
fclose(fid);
That should reveal the reason the incompatibilities exist.
Importing the lines as cell arrays could also work. That might be as simple as enclosing them in curly braces:
fid = fopen(filename, 'r');
for x = 1 : 4
CTW.c8(x) = {string(fread(fid, 8, '*char')')};
end
for x = 1 : 6
CTW.c20(x) = {string(fread(fid, 20, '*char')')};
end
fclose(fid);
.
  댓글 수: 3
Jim McIntyre
Jim McIntyre 2025년 8월 18일
편집: Jim McIntyre 2025년 8월 18일
Your second answer seems to be the way forward. I guess I need a serious primer on the use of curly braces ;-) It works as a cell arrray of strings, or as a cell array of char arrays (below). So That's the way I'm going to go. Thank you!
fid = fopen(filename, 'r');
for x = 1 : 4
CTW.c8(x) = {fread(fid, 8, '*char')'};
end
for x = 1 : 6
CTW.c20(x) = {fread(fid, 20, '*char')'};
end
fclose(fid);
Star Strider
Star Strider 2025년 8월 18일
편집: Star Strider 2025년 8월 18일
As always, my pleasure!
EDIT -- (18 Aug 2025 at 13:45)
Expanding on that, curly braces create a cell array. Cell arrays can hold different clases of variables, as well as different sizes of the same variable. It is usually straightforward to use them, however it may be necessary to use cellfun to deal with them efficiently.
.

댓글을 달려면 로그인하십시오.

추가 답변 (1개)

Walter Roberson
Walter Roberson 2025년 8월 15일
Your loop code has a problem when you reach end of file. In such a case, fread() returns empty, and string(empty) returns a 0 x 0 string, which cannot be stored in a 1 x 1 destination.
  댓글 수: 1
Jim McIntyre
Jim McIntyre 2025년 8월 18일
The problem is occurring in the very first iteration of the first loop, long before I reach the end of the file. As I said, I can read data using the other method, so there's data there, but for some reason the allocation isn't working.

댓글을 달려면 로그인하십시오.

카테고리

Help CenterFile Exchange에서 Whos에 대해 자세히 알아보기

제품


릴리스

R2025a

Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!

Translated by