Error using fprintf invalid file identifier use fopen to generate a valid file identifier

I have output (stored in variable "x") that I want saved into a simple text file. If I use the command: fprintf('%dn',x); it prints the data in a nice column. This is what I want. Then to save it to a file I try this: fileID = fopen('x.txt'); fprintf('%dn',x); fclose(fileID)...
You are using an out of date browser. It may not display this or other websites correctly.
You should upgrade or use an alternative browser.
  • Forums

  • Mathematics

  • MATLAB, Maple, Mathematica, LaTeX

(quick) Matlab fprintf question

  • MATLAB

  • Thread starter
    astropi

  • Start date
    Aug 23, 2012

  • Aug 23, 2012
  • #1
I have output (stored in variable «x») that I want saved into a simple text file. If I use the command:

fprintf(‘%dn’,x);

it prints the data in a nice column. This is what I want. Then to save it to a file I try this:

fileID = fopen(‘x.txt’);
fprintf(‘%dn’,x);
fclose(fileID);

however Matlab does not like this. When I searched the help file, it gave a similar example, so what am I doing wrong here? Thanks in advance!

Answers and Replies

  • Aug 24, 2012
  • #2
Try specifying the file ID as the first parameter.

fileID = fopen(‘x.txt’);
fprintf(fileID,’%dn’,x);

  • Aug 24, 2012
  • #3
Try specifying the file ID as the first parameter.

fileID = fopen(‘x.txt’);
fprintf(fileID,’%dn’,x);

Thanks for the help, but unfortunately it did not work. I still get this error from Matlab:

Error using fprintf
Invalid file identifier. Use fopen to generate a valid file identifier.

when I try my code:

fileID = fopen(‘x.txt’);
fprintf(‘%dn’,x);
fclose(fileID);

the error I get is:

Error using fclose
Invalid file identifier. Use fopen to generate a valid file identifier.

I still can’t figure out why?

  • Aug 24, 2012
  • #4
When you open the file, you need to specify the permission, which is related to what you want to do with the file (read it, write to it, and so on).

Here’s a link to some documentation for fopen: http://amath.colorado.edu/computing/Matlab/OldTechDocs/ref/fopen.html [Broken].

Try this:

fileID = fopen('x.txt', 'wt');
fprintf('%dn',x);
fclose(fileID);

I don’t have MATLAB, so can’t verify that this will work, but I think it will.

Last edited by a moderator: May 6, 2017

  • Aug 24, 2012
  • #5
Thanks for the help, but unfortunately it did not work. I still get this error from Matlab:

Error using fprintf
Invalid file identifier. Use fopen to generate a valid file identifier.

when I try my code:

fileID = fopen(‘x.txt’);
fprintf(‘%dn’,x);
fclose(fileID);

the error I get is:

Error using fclose
Invalid file identifier. Use fopen to generate a valid file identifier.

I still can’t figure out why?

Ok, well in that case it appears that your problem is with the fopen statement (BTW. Is there any particular reason why you didn’t post the actual error message in the first place!)

Try letting it know that the file doesn’t currently exit and that you wish to create it.

fileID = fopen(‘x.txt’,’w’);

This tells it that you want to open the file for writing.

  • Aug 24, 2012
  • #6
Ok, well in that case it appears that your problem is with the fopen statement (BTW. Is there any particular reason why you didn’t post the actual error message in the first place!)

Try letting it know that the file doesn’t currently exit and that you wish to create it.

fileID = fopen(‘x.txt’,’w’);

This tells it that you want to open the file for writing.

Thanks! I really can’t think of why I did not post the error in the first place, except that I’ve not had much sleep :)

Edit: OK, got it! Thanks everyone for the help!

Suggested for: (quick) Matlab fprintf question

  • Last Post
  • Jan 24, 2023
  • Last Post
  • Sep 25, 2020
  • Last Post
  • Jan 7, 2023
  • Last Post
  • Oct 27, 2021
  • Last Post
  • Apr 21, 2022
  • Last Post
  • Aug 26, 2021
  • Last Post
  • Aug 25, 2021
  • Last Post
  • Oct 29, 2022
  • Last Post
  • Apr 16, 2021
  • Last Post
  • Jul 12, 2021
  • Forums

  • Mathematics

  • MATLAB, Maple, Mathematica, LaTeX

Djony1987

Пользователь
Сообщения: 123
Зарегистрирован: Пн мар 02, 2009 8:30 pm

Считывание двоичного файла

Здравствуйте!

Есть бинарный файл, который имеет следующую структуру:

|3 байта|2 байта,I составляющая|2 байта,Q составляющая| и повторяется…

Как мне I и Q записать в отдельные массивы?

Код: Выделить всё

fid = fopen('c:/signal2');
i=0;
while 1
    a(i) = fread(fid, 3, 'uint32');
    I(i) = fread(fid, 2, 'uint16');
    Q(i) = fread(fid, 2, 'uint16');
    i=i+1;
end
fclose(fid);

Попытался сделать так, но не работатет…как правильно в этом случае сделать?

Спасибо!


Jey

Пользователь
Сообщения: 2714
Зарегистрирован: Вт сен 12, 2006 2:21 pm

Сообщение Jey » Ср апр 07, 2010 7:47 pm

1. В матлабе индексы начинаются с единицы, а не с нуля.

2. while 1 — это безобразие.


Djony1987

Пользователь
Сообщения: 123
Зарегистрирован: Пн мар 02, 2009 8:30 pm

Сообщение Djony1987 » Ср апр 07, 2010 8:01 pm

Jey писал(а):1. В матлабе индексы начинаются с единицы, а не с нуля.

Ясно, ступил…как можно блок 3 байта записать в 1 элемент массива?
Он ругается:

In an assignment A(I) = B, the number of elements in B and
I must be the same.

Error in ==> Untitled1213 at 4
a(i) = fread(fid, 3, ‘uint32’);

Jey писал(а):2. while 1 — это безобразие.

Пример такой в справке есть)

В Си был EOF — end of file,

можо было написать while(fd!=EOF) …

fd — дескриптор файлы.

как в матлабе это сделать?

Сенк!


Jey

Пользователь
Сообщения: 2714
Зарегистрирован: Вт сен 12, 2006 2:21 pm

Сообщение Jey » Ср апр 07, 2010 8:16 pm

1. Что за тип данных такой 3 байта?

2. a(i) = fread(fid, 1, ‘uint32’); — целое беззнаковое число 4 байта.

3. eofstat = feof(fid); — конец файла


Djony1987

Пользователь
Сообщения: 123
Зарегистрирован: Пн мар 02, 2009 8:30 pm

Сообщение Djony1987 » Ср апр 07, 2010 8:33 pm

Jey писал(а):1. Что за тип данных такой 3 байта?

Типа данных нет, но мне надо эти 3 байта записать в массив, чтобы не мешал, тогда если uint32 буду использовать он 4 байта считает…
Наверно надо вначале 1 байт, uint8 а потом uint16. Он при fread указатель перемещает?

Jey писал(а):3. eofstat = feof(fid); — конец файла

Сенк!

Сделал так:

Код: Выделить всё

fid = fopen('c:/signal2');
i=1;
while ~feof(fid)
    dt(i) = fread(fid, 1, 'uint8');
    offset(i) = fread(fid, 1, 'uint8');
    gain(i) = fread(fid, 1, 'uint8');
    I(i) = fread(fid, 1, 'uint16');
    Q(i) = fread(fid, 1, 'uint16');
    i=i+1;
end
fclose(fid);

Вроде считал :) Спасибо!


Djony1987

Пользователь
Сообщения: 123
Зарегистрирован: Пн мар 02, 2009 8:30 pm

Сообщение Djony1987 » Пн апр 19, 2010 7:17 am

Всем привет!

Такой вопрос, код:

Код: Выделить всё

fid = fopen('c:/signal15_14_04_10_10M');
i=1;

dt = fread(fid, 1, 'float32');
offset = fread(fid, 1, 'float32');
gain = fread(fid, 1, 'float32');

while ~feof(fid)
    I(i) = fread(fid, 1, 'int16');
    Q(i) = fread(fid, 1, 'int16');
    i=i+1;
end
fclose(fid);

пишет ошибку:

??? Error using ==> fread
Invalid file identifier. Use fopen to generate a valid file identifier.

Error in ==> Untitled1213 at 4
dt = fread(fid, 1, ‘float32’);

В чем может быть проблема?

Если убрать все, кроме первой строчки то ошибок нет, т.е. идентификатор файла должен быть правильный…

Спасибо!


mlslkfpu

Пользователь
Сообщения: 353
Зарегистрирован: Ср сен 22, 2004 4:49 pm

Сообщение mlslkfpu » Пн апр 19, 2010 9:37 am

Djony1987 писал(а):Если убрать все, кроме первой строчки то ошибок нет, т.е. идентификатор файла должен быть правильный…

Не обязательно, если fopen не может открыть файл, она не выдает ошибку, а возвратит fid=-1. Вот и проверьте, что это не так, тогда можно читать файл.


Djony1987

Пользователь
Сообщения: 123
Зарегистрирован: Пн мар 02, 2009 8:30 pm

Сообщение Djony1987 » Пн апр 19, 2010 11:56 am

mlslkfpu писал(а):Не обязательно, если fopen не может открыть файл, она не выдает ошибку, а возвратит fid=-1. Вот и проверьте, что это не так, тогда можно читать файл.

Сенк! -1 как раз был, сейчас вроде норм считывает. Но возникает еще одна ошибка:

??? In an assignment A(I) = B, the number of elements in B and
I must be the same.

Error in ==> Untitled1213 at 9
I(i) = fread(fid, 1, ‘int16’);

Это может быть, что уже почти конец файла но для текущего значения не хватает бит, т.е. остается 3 бита, а надо для значения 16 и т.д.?


Jey

Пользователь
Сообщения: 2714
Зарегистрирован: Вт сен 12, 2006 2:21 pm

Сообщение Jey » Пн апр 19, 2010 1:49 pm

Djony1987 писал(а):In an assignment A(I) = B, the number of elements in B and
I must be the same.

Error in ==> Untitled1213 at 9
I(i) = fread(fid, 1, ‘int16’);

Вообще эта ошибка возникает, когда I(i) должно содержать одно число, а fread(fid, 1, ‘int16’) возвращает либо ничего, либо более одного числа.

Вы бы ~feof(fid) делали после каждого fread.


iglin

Эксперт
Сообщения: 1584
Зарегистрирован: Ср сен 22, 2004 4:49 pm

Сообщение iglin » Пн апр 19, 2010 6:50 pm

А почему бы не воспользоваться командой fseek, чтобы подвести указатель к нужной позиции?

С.П.Иглин


Hi. I have been using the same code since 2006 and now I have the newest version of MatLab and when I run the code I get the following error:

Error using fprintf

Invalid file identifier. Use fopen to generate a valid file identifier.

lp_file = input(‘Enter file name for saving output: ‘,‘s’);

lpfid = fopen(lp_file,‘w’);

runlabel = input(‘Enter title: ‘,‘s’);

runlabel = [runlabel ‘ ‘ datestr(now,0)];

fprintf(lpfid,[runlabel ‘n’]);

load ‘evs.txt’

X = evs(:,2:13);

[N nv] = size(X);

numvar = [1: 1: nv]’;

sampnums = evs(:,1);

X = X ./ 1000.;

xmean = mean(X)’;

xvar = var(X)’;

format = ‘%7i %20.4f %20.4f n’;

fprintf(lpfid,‘Var. Num. Means Variance n’);

fprintf(lpfid,format,[numvar xmean xvar]’);

alpha = input(‘alpha level, e.g. 95: ‘);

disp(‘Enter 0 for No Pretreatment, 1 for Constant Mean,’);

mode = input( ‘2 for percent max and 3 for log: ‘);

vectorlengths = sqrt(diag(X * X’));

[XF, Xmin, Xmax, Ks, Kbar, constant] = transform(X,mode,lpfid);

[U,B,F,scF,Lambda,Pervar,Cumvar,count] = qmode(XF,alpha);

Lambda = diag(Lambda);

fprintf(lpfid,‘n’);

nout = size(F,2);

nvcount =[1: 1:count];

fprintf(lpfid,‘ Eigen Values Per. Variance Accumulative Variance n’);

fprintf(lpfid,‘%10i %10.4f %10.4f %10.4f n’,[nvcount’ Lambda(1:count) Pervar(1:count) Cumvar(1:count)]’);

fprintf(lpfid,‘n’);

matrixprint(lpfid,‘Principal Factor Scores Matrix’,F);

message = [‘Count = ‘, num2str(count)];

disp(message);

Pervar(1:count)

count = input(‘Enter NO. of Factors to keep: ‘);

B = B(:,1:count);

comm = diag(B*B’);

Info = diag(B’*B);

PerInfo = Info * 100/N;

CumInfo = cumsum(PerInfo);

matrixprint(lpfid,‘Sample No. Factor Loadings Matrix’, [sampnums comm B]);

format = »;

for j = 1: count

format = [format,‘%8.4f ‘];

end

format = [format,‘n’];

fprintf(lpfid,[‘Percent Information ‘ format],[PerInfo(1:count)’]);

fprintf(lpfid,[‘Cumulative Info. ‘ format],[CumInfo(1:count)’]);

fprintf(lpfid,‘n’);

[CFS, scalefactors] = compositionscores(F,Kbar,Xmax,Xmin);

scalefactors = scalefactors(1:count);

CFS = CFS(:, 1:count);

matrixprint(lpfid,‘Factor Composition Scores ‘,CFS);

goodness = nodosgoodns(X,B,CFS,scalefactors,Xmax,Xmin,Ks, Kbar,vectorlengths,lpfid);

[B, T] = varimax(count,B);

comm = diag(B*B’);

Info = diag(B’*B);

PerInfo = Info * 100/N;

CumInfo = cumsum(PerInfo);

matrixprint(lpfid,‘Varimax Factors’,[sampnums comm B ]);

fprintf(lpfid,[‘Percent Information ‘ format],[PerInfo(1:count)’]);

fprintf(lpfid,[‘Cumulative Info. ‘ format],[CumInfo(1:count)’]);

fprintf(lpfid,‘n’);

F = F(:,1:count);

L = F*T;

matrixprint(lpfid,‘VARIMAX Factor Scores Matrix ‘,L);

Can someone help me (I apologize but I am not a atLab expert). Why would the version I am using now not work? Thanks in advance

Андрей Ларин

0 / 0 / 0

Регистрация: 24.11.2013

Сообщений: 20

1

30.11.2013, 00:53. Показов 9256. Ответов 13

Метки нет (Все метки)


Доброго времени суток,
столкнулся с тем что необходимо создать файл .txt с текущей датой, и в этот файл записывать данные.

Matlab M
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
clear all
clc
mkdir('C:DATA2'); 
le=datestr(date,'yyyy.mm.dd')
[G, ges]=fopen('C:DATA2data.txt','w');
fclose(G);
% вот здесь вместо data.txt надо бы значение le поставить
[F, mes]=fopen('C:DATA2data.txt','rt+');
 
count=1;
loop=20;
while ~isequal(count,loop)
re=datestr(clock,'HH:MM:SS');
fprintf(F, '%8s n',  re)
end
fclose(F)

скажите пожалуйста как можно это сделать?

__________________
Помощь в написании контрольных, курсовых и дипломных работ, диссертаций здесь



0



Programming

Эксперт

94731 / 64177 / 26122

Регистрация: 12.04.2006

Сообщений: 116,782

30.11.2013, 00:53

13

Sledge5

536 / 523 / 38

Регистрация: 13.03.2011

Сообщений: 727

01.12.2013, 11:36

2

Вместо

Matlab M
1
'C:DATA2data.txt'

подставьте

Matlab M
1
sprintf('C:DATA2%s.txt', le)



0



Андрей Ларин

0 / 0 / 0

Регистрация: 24.11.2013

Сообщений: 20

01.12.2013, 13:48

 [ТС]

3

Спасибо что откликнулись, попробовал изпользовать

Matlab M
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
clear all
clc
mkdir('C:DATA2'); 
le=datestr(date,'yyyy.mm.dd')
[G, ges]=fopen('C:DATA2data.txt','w');
fclose(G);
% вот здесь вместо data.txt надо бы значение le поставить
[F mes]=fopen(sprintf('C:DATA2%s.txt', le),'rt+')
count=1;
loop=20;
while ~isequal(count,loop)
count=count+1
re=datestr(clock,'HH:MM:SS')
fprintf(F, '%8s n',  re)
pause (1)
end
fclose(F)

при этом после выполнения 8-ой строки выходит сообщение

Matlab M
1
2
3
4
5
6
7
8
F =
 
    -1
 
 
mes =
 
Cannot open file. Existence? Permissions? Memory? . . .

и после выполнения 14-ой строки:

Matlab M
1
2
3
4
5
6
??? Error using ==> fprintf
Invalid file identifier.  Use fopen to
generate a valid file identifier.
 
Error in ==> CyberAdvice at 14
fprintf(F, '%8s n',  re)



0



536 / 523 / 38

Регистрация: 13.03.2011

Сообщений: 727

01.12.2013, 20:54

4

Внимательно смотрите, какой файл создаете, а какой пытаетесь открыть в строке 8.



0



0 / 0 / 0

Регистрация: 24.11.2013

Сообщений: 20

02.12.2013, 13:48

 [ТС]

5

Попробовал разные варианты, прочитал как команда sprintf работает. не дошел . если не сложно подскажите (мне также записывать данные нужно в этот .txt).
P.S. sprintf как я понял для совмещения строковых данных и числами, и то что после процента это число. Так же прогуглил на англ языке. но у меня не выходит и все (((



0



536 / 523 / 38

Регистрация: 13.03.2011

Сообщений: 727

02.12.2013, 17:42

6

Опишите алгоритм действий.



0



Андрей Ларин

0 / 0 / 0

Регистрация: 24.11.2013

Сообщений: 20

02.12.2013, 18:34

 [ТС]

7

то что сделал выглядит так:

Matlab M
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
clear all   %удаляю все 
clc                                %очищаяю командное окно
mkdir('C:DATA2');           % создаю папку на диске С, с названием DATA2
le=datestr(date,'yyyy.mm.dd')  % записываю в le дату в виде строки   
[G, ges]=fopen('C:DATA2data.txt','w');% открываю в папке DATA2 текстовый файл  
                                              %с названиемdata для чтения и присваиваю 
                                               %ему дескриптор
fclose(G);                                                % закрываю
[F mes]=fopen('C:DATA2data.txt','rt+')   % открываю в папке DATA2 текстовый файл с  
                                                         %названием data для записи и  
                                                         %присваиваю ему дескриптор
 
count=1;                                             % дальше работа с циклом
loop=20;
while ~isequal(count,loop)                            
count=count+1
re=datestr(clock,'HH:MM:SS')    % запршиваю время в формате 'HH:MM:SS'
                                            % и записываю  в re
fprintf(F, '%8s n',  re)             % re записываю в текстовый файл по пути 
                                            %C:DATA2data.txt
pause (1)
end
fclose(F)                                % закрываю текстовый файл



0



536 / 523 / 38

Регистрация: 13.03.2011

Сообщений: 727

03.12.2013, 02:52

8

Что нужно-то в итоге?
Кстати:
Строка 5 — не открываете файл для чтения, а открываете для записи или создаёте, если его не было. Если он был, то он становится пустым после Ваших действий (строки 5-8).



0



0 / 0 / 0

Регистрация: 24.11.2013

Сообщений: 20

05.12.2013, 09:18

 [ТС]

9

ммм, в итоге нужно что создавался текстовый файл в который бы записывались данные а имя файла должно соответствовать дате текущей. такая вот задумка

Добавлено через 2 минуты
согласен с Вами строки 5-8 выглядят лишними



0



Sledge5

536 / 523 / 38

Регистрация: 13.03.2011

Сообщений: 727

05.12.2013, 12:19

10

Я бы так сделал:

Matlab M
1
2
3
4
5
6
7
8
9
10
clear all, clc
if ~exist('C:DATA2', 'dir')
    mkdir('C:DATA2'); % создаю папку на диске С, с названием DATA2
end
G = fopen(sprintf('C:DATA2data_%s.txt', datestr(date,'yyyy.mm.dd')),'w');
loop = 20;
for i = 1 : loop
    fprintf(F, '%8s n', datestr(clock,'HH:MM:SS')); % re записываю в текстовый файл по пути 
end
fclose(F)



0



0 / 0 / 0

Регистрация: 24.11.2013

Сообщений: 20

06.12.2013, 14:11

 [ТС]

11

спасибо

Добавлено через 8 минут
Попробовал, после выполнения 4-ой строки выходит сообщение: Warning: Invalid escape sequence appears in
format string. See help sprintf for valid
escape sequences.
> In AdviceCy at 5
и после выполнеиня 8-ой строки:
??? Error using ==> fprintf
Invalid file identifier. Use fopen to
generate a valid file identifier.

Error in ==> AdviceCy at 8
fprintf(F, ‘%8s n’,
datestr(clock,’HH:MM:SS’)); % re
записываю в текстовый файл по пути



0



Sledge5

536 / 523 / 38

Регистрация: 13.03.2011

Сообщений: 727

06.12.2013, 18:04

12

Исправлена строка 5. Остальное без изменений:

Matlab M
1
2
3
4
5
6
7
8
9
10
clear all, clc
if ~exist('C:DATA2', 'dir')
    mkdir('C:DATA2'); % создаю папку на диске С, с названием DATA2
end
G = fopen(sprintf('C:\DATA2\data_%s.txt', datestr(date,'yyyy.mm.dd')),'w');
loop = 20;
for i = 1 : loop
    fprintf(F, '%8s n', datestr(clock,'HH:MM:SS')); % re записываю в текстовый файл по пути 
end
fclose(F)



1



Андрей Ларин

0 / 0 / 0

Регистрация: 24.11.2013

Сообщений: 20

06.12.2013, 22:16

 [ТС]

13

а Вы ГОЛОВА (Эх, нравится мне все таки MatLab ) . Спасибо. как вижу Вы заменили на две \, если можете прокомментируйте для чего это? и что это дает?

Добавлено через 15 минут
я вспомнил почему сделал так

Matlab M
1
2
3
[G, ges]=fopen('C:DATA2data.txt','w');      
fclose(G);                                                
[F mes]=fopen('C:DATA2data.txt','rt+')

Если я открываю .txt для записи то есть с ‘w’ в конце то он записывает данные в одну строчку не смотря на то что стоит n перед записываемыми данными, и как только меняю на ‘rt+’ и ставлю n то как положено каждая запись с новой строки. Вы не знаете почему так происходит? и как с этим бороться? ( в учебниках почему то про такое не пишут)



0



Sledge5

536 / 523 / 38

Регистрация: 13.03.2011

Сообщений: 727

08.12.2013, 01:06

14

Цитата
Сообщение от Андрей Ларин
Посмотреть сообщение

Вы не знаете почему так происходит? и как с этим бороться?

Потому что в строке 5 опять ошибочка закралась:
не

Matlab M
1
G = fopen(sprintf('C:\DATA2\data_%s.txt', datestr(date,'yyyy.mm.dd')),'w');

а

Matlab M
1
F = fopen(sprintf('C:\DATA2\data_%s.txt', datestr(date,'yyyy.mm.dd')),'w');

Цитата
Сообщение от Андрей Ларин
Посмотреть сообщение

Спасибо. как вижу Вы заменили на две \, если можете прокомментируйте для чего это? и что это дает?

В строке 5 в функции sprintf происходит интерполяция: все escape-последовательности заменяются соответствующими спецсимволами (например, ‘n’ — перевод строки, ‘t’ — табуляция и т.д.).
Чтобы «подсунуть» MATLABу в строке символ », ему надо написать ‘\’ (это отменяет специальное значение символа » в интерполируемых строках). Так принято во многих языках программирования.
В первоначальном варианте в строке встречался символ escape-последовательности ‘D’, который не имеет смысла, из-за чего MATLAB и выдавал предупреждение.



0



Понравилась статья? Поделить с друзьями:
  • Error use of parameter outside function body before token
  • Error use of deleted function
  • Error upstream service unavailable error description upstream service unavailable code 106133
  • Error upstream prematurely closed connection while reading response header from upstream
  • Error uploading image soundcloud