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 Center および File ExchangeWhos についてさらに検索

製品


リリース

R2025a

Community Treasure Hunt

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

Start Hunting!

Translated by