??? Error using ==> fscanf. Invalid file identifier. Use fopen to generate a valid file identifier.
显示 更早的评论
Hi to all. I have this kind of problem: I need to load into a 3D matrix about 4.000 files, that were into 26 different directory, and that files are 85 for each of this 26 directory (I have 26 directory, into every directory I have two subdirectory "run1" and "run2" and inside this two subdirectory I have 85 files). I create two lists, one list of numbers and one list of characters. This is my code:
% Initialization vectors Esami and ROIs
list_exam = [30852 22061 20769 21734 21735 21977 20856 21976 20086 30697 30630 19993 30018 28832 19725 22440 28333 22439 22587 22586 21403 30944 21405 30943 22337 30948];
list_ROI = ['ts_onto3D_aparc+aseg_Left-Cerebellum-Cortex.nii.gz ';
'ts_onto3D_aparc+aseg_Thalamus-Proper.nii.gz ';
'ts_onto3D_aparc+aseg_Left-Caudate.nii.gz ';
'ts_onto3D_aparc+aseg_Left-Putamen.nii.gz ';
'ts_onto3D_aparc+aseg_Left-Pallidum.nii.gz ';
'ts_onto3D_aparc+aseg_Brain-Stem.nii.gz ';
'ts_onto3D_aparc+aseg_Left-Hippocampus.nii.gz ';
'ts_onto3D_aparc+aseg_Left-Amygdala.nii.gz ';
'ts_onto3D_aparc+aseg_Left-Accumbens-area.nii.gz ';
'ts_onto3D_aparc+aseg_Left-VentralDC.nii.gz ';
'ts_onto3D_aparc+aseg_Right-Cerebellum-Cortex.nii.gz ';
'ts_onto3D_aparc+aseg_Right-Thalamus-Proper.nii.gz ';
'ts_onto3D_aparc+aseg_Right-Caudate.nii.gz ';
'ts_onto3D_aparc+aseg_Right-Putamen.nii.gz ';
'ts_onto3D_aparc+aseg_Right-Pallidum.nii.gz ';
'ts_onto3D_aparc+aseg_Right-Hippocampus.nii.gz ';
'ts_onto3D_aparc+aseg_Right-Amygdala.nii.gz ';
'ts_onto3D_aparc+aseg_Right-Accumbens-area.nii.gz ';
'ts_onto3D_aparc+aseg_Right-VentralDC.nii.gz ';
'ts_onto3D_aparc+aseg_ctx-lh-caudalanteriorcingulate.nii.gz ';
'ts_onto3D_aparc+aseg_ctx-lh-caudalmiddlefrontal.nii.gz ';
'ts_onto3D_aparc+aseg_ctx-lh-cuneus.nii.gz ';
'ts_onto3D_aparc+aseg_ctx-lh-entorhinal.nii.gz ';
'ts_onto3D_aparc+aseg_ctx-lh-fusiform.nii.gz ';
'ts_onto3D_aparc+aseg_ctx-lh-inferiorparietal.nii.gz ';
'ts_onto3D_aparc+aseg_ctx-lh-inferiortemporal.nii.gz ';
'ts_onto3D_aparc+aseg_ctx-lh-isthmuscingulate.nii.gz ';
'ts_onto3D_aparc+aseg_ctx-lh-lateraloccipital.nii.gz ';
'ts_onto3D_aparc+aseg_ctx-lh-lateralorbitofrontal.nii.gz ';
'ts_onto3D_aparc+aseg_ctx-lh-lingual.nii.gz ';
'ts_onto3D_aparc+aseg_ctx-lh-medialorbitofrontal.nii.gz ';
'ts_onto3D_aparc+aseg_ctx-lh-middletemporal.nii.gz ';
'ts_onto3D_aparc+aseg_ctx-lh-parahippocampal.nii.gz ';
'ts_onto3D_aparc+aseg_ctx-lh-paracentral.nii.gz ';
'ts_onto3D_aparc+aseg_ctx-lh-parsopercularis.nii.gz ';
'ts_onto3D_aparc+aseg_ctx-lh-parsorbitalis.nii.gz ';
'ts_onto3D_aparc+aseg_ctx-lh-parstriangularis.nii.gz ';
'ts_onto3D_aparc+aseg_ctx-lh-pericalcarine.nii.gz ';
'ts_onto3D_aparc+aseg_ctx-lh-postcentral.nii.gz ';
'ts_onto3D_aparc+aseg_ctx-lh-posteriorcingulate.nii.gz ';
'ts_onto3D_aparc+aseg_ctx-lh-precentral.nii.gz ';
'ts_onto3D_aparc+aseg_ctx-lh-precuneus.nii.gz ';
'ts_onto3D_aparc+aseg_ctx-lh-rostralanteriorcingulate.nii.gz';
'ts_onto3D_aparc+aseg_ctx-lh-rostralmiddlefrontal.nii.gz ';
'ts_onto3D_aparc+aseg_ctx-lh-superiorfrontal.nii.gz ';
'ts_onto3D_aparc+aseg_ctx-lh-superiorparietal.nii.gz ';
'ts_onto3D_aparc+aseg_ctx-lh-superiortemporal.nii.gz ';
'ts_onto3D_aparc+aseg_ctx-lh-supramarginal.nii.gz ';
'ts_onto3D_aparc+aseg_ctx-lh-frontalpole.nii.gz ';
'ts_onto3D_aparc+aseg_ctx-lh-temporalpole.nii.gz ';
'ts_onto3D_aparc+aseg_ctx-lh-transversetemporal.nii.gz ';
'ts_onto3D_aparc+aseg_ctx-lh-insula.nii.gz ';
'ts_onto3D_aparc+aseg_ctx-rh-caudalanteriorcingulate.nii.gz ';
'ts_onto3D_aparc+aseg_ctx-rh-caudalmiddlefrontal.nii.gz ';
'ts_onto3D_aparc+aseg_ctx-rh-cuneus.nii.gz ';
'ts_onto3D_aparc+aseg_ctx-rh-entorhinal.nii.gz ';
'ts_onto3D_aparc+aseg_ctx-rh-fusiform.nii.gz ';
'ts_onto3D_aparc+aseg_ctx-rh-inferiorparietal.nii.gz ';
'ts_onto3D_aparc+aseg_ctx-rh-inferiortemporal.nii.gz ';
'ts_onto3D_aparc+aseg_ctx-rh-isthmuscingulate.nii.gz ';
'ts_onto3D_aparc+aseg_ctx-rh-lateraloccipital.nii.gz ';
'ts_onto3D_aparc+aseg_ctx-rh-lateralorbitofrontal.nii.gz ';
'ts_onto3D_aparc+aseg_ctx-rh-lingual.nii.gz ';
'ts_onto3D_aparc+aseg_ctx-rh-medialorbitofrontal.nii.gz ';
'ts_onto3D_aparc+aseg_ctx-rh-middletemporal.nii.gz ';
'ts_onto3D_aparc+aseg_ctx-rh-parahippocampal.nii.gz ';
'ts_onto3D_aparc+aseg_ctx-rh-paracentral.nii.gz ';
'ts_onto3D_aparc+aseg_ctx-rh-parsopercularis.nii.gz ';
'ts_onto3D_aparc+aseg_ctx-rh-parsorbitalis.nii.gz ';
'ts_onto3D_aparc+aseg_ctx-rh-parstriangularis.nii.gz ';
'ts_onto3D_aparc+aseg_ctx-rh-pericalcarine.nii.gz ';
'ts_onto3D_aparc+aseg_ctx-rh-postcentral.nii.gz ';
'ts_onto3D_aparc+aseg_ctx-rh-posteriorcingulate.nii.gz ';
'ts_onto3D_aparc+aseg_ctx-rh-precentral.nii.gz ';
'ts_onto3D_aparc+aseg_ctx-rh-precuneus.nii.gz ';
'ts_onto3D_aparc+aseg_ctx-rh-rostralanteriorcingulate.nii.gz';
'ts_onto3D_aparc+aseg_ctx-rh-rostralmiddlefrontal.nii.gz ';
'ts_onto3D_aparc+aseg_ctx-rh-superiorfrontal.nii.gz ';
'ts_onto3D_aparc+aseg_ctx-rh-superiorparietal.nii.gz ';
'ts_onto3D_aparc+aseg_ctx-rh-superiortemporal.nii.gz ';
'ts_onto3D_aparc+aseg_ctx-rh-supramarginal.nii.gz ';
'ts_onto3D_aparc+aseg_ctx-rh-frontalpole.nii.gz ';
'ts_onto3D_aparc+aseg_ctx-rh-temporalpole.nii.gz ';
'ts_onto3D_aparc+aseg_ctx-rh-transversetemporal.nii.gz ';
'ts_onto3D_aparc+aseg_ctx-rh-insula.nii.gz '];
% Initialization matrix 3-D
A1 = zeros(26,85,90);
% Loop for run1
for i=1:26
for j=1:85
file = 'C:\Temporal_series\list_exam[i]\run1\list_ROI[j]';
fid_1 = fopen(file,'r+');
A1 = fscanf(fid_1,'%f %f', [90 1]);
A1 = A1';
fclose(fid_1);
end
end
Now, the error is :
??? Error using ==> fscanf Invalid file identifier. Use fopen to generate a valid file identifier.
I think that the problem is about the vectors index inside path of fopen.
Someone can help me? Thank you
采纳的回答
更多回答(4 个)
Hi Lorenzo,
You're trying to read a file named literally
file = 'C:\Temporal_series\list_exam[i]\run1\list_ROI[j]';
this file does not exist. The error is not with fscanf, but with fopen which tries to open a file that doesn't exist.
what you want is :
for i=1:26
for j=1:85
file = sprintf('C:\\Temporal_series\\%d\\run1\\%s',list_exam(i),list_ROI{j});
fid_1 = fopen(file,'r+');
A1 = fscanf(fid_1,'%f %f', [90 1]);
A1 = A1';
fclose(fid_1);
end
end
Note I change the definition of your data list_ROI by making it a cell array. it's cleaner to use (no need to define multiple space to concatenate string array.)
list_exam = [30852 22061 20769 21734 21735 21977 20856 21976 20086 30697 30630 19993 30018 28832 19725 22440 28333 22439 22587 22586 21403 30944 21405 30943 22337 30948];
list_ROI = {'ts_onto3D_aparc+aseg_Left-Cerebellum-Cortex.nii.gz';
'ts_onto3D_aparc+aseg_Thalamus-Proper.nii.gz';
'ts_onto3D_aparc+aseg_Left-Caudate.nii.gz';
'ts_onto3D_aparc+aseg_Left-Putamen.nii.gz';
'ts_onto3D_aparc+aseg_Left-Pallidum.nii.gz';
'ts_onto3D_aparc+aseg_Brain-Stem.nii.gz';
'ts_onto3D_aparc+aseg_Left-Hippocampus.nii.gz';
'ts_onto3D_aparc+aseg_Left-Amygdala.nii.gz';
'ts_onto3D_aparc+aseg_Left-Accumbens-area.nii.gz';
'ts_onto3D_aparc+aseg_Left-VentralDC.nii.gz';
'ts_onto3D_aparc+aseg_Right-Cerebellum-Cortex.nii.gz';
'ts_onto3D_aparc+aseg_Right-Thalamus-Proper.nii.gz';
'ts_onto3D_aparc+aseg_Right-Caudate.nii.gz';
'ts_onto3D_aparc+aseg_Right-Putamen.nii.gz';
'ts_onto3D_aparc+aseg_Right-Pallidum.nii.gz';
'ts_onto3D_aparc+aseg_Right-Hippocampus.nii.gz';
'ts_onto3D_aparc+aseg_Right-Amygdala.nii.gz';
'ts_onto3D_aparc+aseg_Right-Accumbens-area.nii.gz';
'ts_onto3D_aparc+aseg_Right-VentralDC.nii.gz';
'ts_onto3D_aparc+aseg_ctx-lh-caudalanteriorcingulate.nii.gz';
'ts_onto3D_aparc+aseg_ctx-lh-caudalmiddlefrontal.nii.gz';
'ts_onto3D_aparc+aseg_ctx-lh-cuneus.nii.gz';
'ts_onto3D_aparc+aseg_ctx-lh-entorhinal.nii.gz';
'ts_onto3D_aparc+aseg_ctx-lh-fusiform.nii.gz';
'ts_onto3D_aparc+aseg_ctx-lh-inferiorparietal.nii.gz';
'ts_onto3D_aparc+aseg_ctx-lh-inferiortemporal.nii.gz';
'ts_onto3D_aparc+aseg_ctx-lh-isthmuscingulate.nii.gz';
'ts_onto3D_aparc+aseg_ctx-lh-lateraloccipital.nii.gz';
'ts_onto3D_aparc+aseg_ctx-lh-lateralorbitofrontal.nii.gz';
'ts_onto3D_aparc+aseg_ctx-lh-lingual.nii.gz';
'ts_onto3D_aparc+aseg_ctx-lh-medialorbitofrontal.nii.gz';
'ts_onto3D_aparc+aseg_ctx-lh-middletemporal.nii.gz';
'ts_onto3D_aparc+aseg_ctx-lh-parahippocampal.nii.gz';
'ts_onto3D_aparc+aseg_ctx-lh-paracentral.nii.gz';
'ts_onto3D_aparc+aseg_ctx-lh-parsopercularis.nii.gz';
'ts_onto3D_aparc+aseg_ctx-lh-parsorbitalis.nii.gz';
'ts_onto3D_aparc+aseg_ctx-lh-parstriangularis.nii.gz';
'ts_onto3D_aparc+aseg_ctx-lh-pericalcarine.nii.gz';
'ts_onto3D_aparc+aseg_ctx-lh-postcentral.nii.gz';
'ts_onto3D_aparc+aseg_ctx-lh-posteriorcingulate.nii.gz';
'ts_onto3D_aparc+aseg_ctx-lh-precentral.nii.gz';
'ts_onto3D_aparc+aseg_ctx-lh-precuneus.nii.gz';
'ts_onto3D_aparc+aseg_ctx-lh-rostralanteriorcingulate.nii.gz';
'ts_onto3D_aparc+aseg_ctx-lh-rostralmiddlefrontal.nii.gz';
'ts_onto3D_aparc+aseg_ctx-lh-superiorfrontal.nii.gz';
'ts_onto3D_aparc+aseg_ctx-lh-superiorparietal.nii.gz';
'ts_onto3D_aparc+aseg_ctx-lh-superiortemporal.nii.gz';
'ts_onto3D_aparc+aseg_ctx-lh-supramarginal.nii.gz';
'ts_onto3D_aparc+aseg_ctx-lh-frontalpole.nii.gz';
'ts_onto3D_aparc+aseg_ctx-lh-temporalpole.nii.gz';
'ts_onto3D_aparc+aseg_ctx-lh-transversetemporal.nii.gz';
'ts_onto3D_aparc+aseg_ctx-lh-insula.nii.gz';
'ts_onto3D_aparc+aseg_ctx-rh-caudalanteriorcingulate.nii.gz';
'ts_onto3D_aparc+aseg_ctx-rh-caudalmiddlefrontal.nii.gz';
'ts_onto3D_aparc+aseg_ctx-rh-cuneus.nii.gz';
'ts_onto3D_aparc+aseg_ctx-rh-entorhinal.nii.gz';
'ts_onto3D_aparc+aseg_ctx-rh-fusiform.nii.gz';
'ts_onto3D_aparc+aseg_ctx-rh-inferiorparietal.nii.gz';
'ts_onto3D_aparc+aseg_ctx-rh-inferiortemporal.nii.gz';
'ts_onto3D_aparc+aseg_ctx-rh-isthmuscingulate.nii.gz';
'ts_onto3D_aparc+aseg_ctx-rh-lateraloccipital.nii.gz';
'ts_onto3D_aparc+aseg_ctx-rh-lateralorbitofrontal.nii.gz';
'ts_onto3D_aparc+aseg_ctx-rh-lingual.nii.gz';
'ts_onto3D_aparc+aseg_ctx-rh-medialorbitofrontal.nii.gz';
'ts_onto3D_aparc+aseg_ctx-rh-middletemporal.nii.gz';
'ts_onto3D_aparc+aseg_ctx-rh-parahippocampal.nii.gz';
'ts_onto3D_aparc+aseg_ctx-rh-paracentral.nii.gz';
'ts_onto3D_aparc+aseg_ctx-rh-parsopercularis.nii.gz';
'ts_onto3D_aparc+aseg_ctx-rh-parsorbitalis.nii.gz';
'ts_onto3D_aparc+aseg_ctx-rh-parstriangularis.nii.gz';
'ts_onto3D_aparc+aseg_ctx-rh-pericalcarine.nii.gz';
'ts_onto3D_aparc+aseg_ctx-rh-postcentral.nii.gz';
'ts_onto3D_aparc+aseg_ctx-rh-posteriorcingulate.nii.gz';
'ts_onto3D_aparc+aseg_ctx-rh-precentral.nii.gz';
'ts_onto3D_aparc+aseg_ctx-rh-precuneus.nii.gz';
'ts_onto3D_aparc+aseg_ctx-rh-rostralanteriorcingulate.nii.gz';
'ts_onto3D_aparc+aseg_ctx-rh-rostralmiddlefrontal.nii.gz';
'ts_onto3D_aparc+aseg_ctx-rh-superiorfrontal.nii.gz';
'ts_onto3D_aparc+aseg_ctx-rh-superiorparietal.nii.gz';
'ts_onto3D_aparc+aseg_ctx-rh-superiortemporal.nii.gz';
'ts_onto3D_aparc+aseg_ctx-rh-supramarginal.nii.gz';
'ts_onto3D_aparc+aseg_ctx-rh-frontalpole.nii.gz';
'ts_onto3D_aparc+aseg_ctx-rh-temporalpole.nii.gz';
'ts_onto3D_aparc+aseg_ctx-rh-transversetemporal.nii.gz';
'ts_onto3D_aparc+aseg_ctx-rh-insula.nii.gz'};
Lorenzo
2014-11-10
6 个评论
Orion
2014-11-10
fopen didn't success to open the file, that's why the output fid is set to -1 (failed to open).
outside your loopr, try to open a single file, to see if it works. in the command window :
file = 'C:\Temporal_series\30852\run1\ts_onto3D_aparc+aseg_Thalamus-Proper.nii.gz';
fid_1 = fopen(file,'r+');
A1 = fscanf(fid_1,'%f %f', [90 1]);
A1 = A1';
fclose(fid_1);
if you get fid_1 = -1, then it failed to open the file.
Also, are you sure of your file's extensions '.nii.gz'. seems weird ?
Lorenzo
2014-11-10
Your extension is .txt. I thought it was .gz.
so, it's normal you get an error, because fopen is trying to open a file with the extension .gz, which is not the correct one.
2 ways to make it work, pick the one you prefer:
1) modify the definition of list_ROI to add the .txt in every name :
list_ROI = {'ts_onto3D_aparc+aseg_Left-Cerebellum-Cortex.nii.gz.txt';
'ts_onto3D_aparc+aseg_Thalamus-Proper.nii.gz.txt';
'ts_onto3D_aparc+aseg_Left-Caudate.nii.gz.txt';
....
2) add the .txt extension in the sprinf command
file = sprintf('C:\\Temporal_series\\%d\\run1\\%s.txt',list_exam(i),list_ROI{j});
I would pick the first one, because you'll get all the information in one location. name and extension defined in the one data list_ROI
Lorenzo
2014-11-10
Lorenzo
2014-11-10
Guillaume
2014-11-10
The most likely reason for this sort of error is because fopen failed to open the file, either because you supplied the wrong filename, or permissions are wrong, or the file is open exclusively by another program, or any other reason.
The first two can be solved easily, supply the correct name / edit the permissions. The others not so much. So I would suggest you make your program resistant to such failures by changing your code to:
[fid_1, errmsg] = fopen(file, 'r+);
if ~isempty(errmsg)
warning('failed to open %s due to %s', file, errmsg); %or use error if you want the code to stop
else
%process the file as normal
end
9 个评论
Lorenzo
2014-11-10
Guillaume
2014-11-10
What does it doesn't work mean?
What error, if any, do you get?
Lorenzo
2014-11-10
Image Analyst
2014-11-10
Regarding your comment to your "Answer" about how to use dir(), see the FAQ for robust code examples: http://matlab.wikia.com/wiki/FAQ#How_can_I_process_a_sequence_of_files.3F
If you want to use dir, the following possibly works, assuming you want to process all directories within Temporal_series and all txt files within run1:
pathroot = 'C:\Temporal_series';
allfiles = dir(fullfile(pathroot, '*')); %use fullfile rather than sprintf to build paths
validdirs = {allfiles([allfiles.isdir] & ~(strcmp({allfiles.name}, '.') | strcmp({allfiles.name}, '..'))).name};
for examdir = validdirs
currentpath = fullfile(pathroot, exmadir{1}, 'run1');
txtfiles = dir(fullfile('currentpath', '*.txt'));
for filename = {txtfiles.name}
[fid, errormsg] = fopen(fullfile(currentpath, filename{1}), 'r+');
if ~isempty(errmsg)
warning('failed to open %s due to %s', file, errmsg);
else
%process as normal
fclose(fid);
end
end
end
Guillaume
2014-11-10
If you get an error on the second file and not the first, it's possibly because the first one exists, but not the second. Maybe you've typed it wrong, or it's in another directory, or ...
Hence, why I recommended using dir.
Lorenzo
2014-11-10
Guillaume
2014-11-10
Sorry, should have been:
validdirs = {allfiles([allfiles.isdir] & ~(strcmp({allfiles.name}, '.') | strcmp({allfiles.name}, '..'))).name};
Lorenzo
2014-11-10
Amanda Eriksson
2022-2-9
0 个投票
I know that this question was originally asked several years ago, but since I ended up with a similair error message and went through this tread I just wanted to insert for future coders that it can be wise to also look if you have added the path for where you have stored your data.
Sometimes it can be a verry simple error one have made, and therefore the fid returns a -1 due to that it does't have access to that pathway where the data is located.
1 个评论
Stephen23
2022-2-9
"it can be wise to also look if you have added the path for where you have stored your data."
No, the path to data files should not be added to the MATLAB search path. The search path is for code files.
To access data files simply use an absolute/relative filename (for which FULLFILE is very useful):
类别
在 帮助中心 和 File Exchange 中查找有关 File Operations 的更多信息
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!