ASSIGNMENT: TEXT FILES Write a function called char_counter that counts the number of a certain character in a text file. The function takes two input arguments, fname, a char vector of the filename and character, the char it counts in the file.
Info
This question is closed. Reopen it to edit or answer.
Show older comments
When testing with '' your solution returned -1 which is incorrect. (0)
This error pops up while doing the assignment.
can anyone tell me why is this error popping and the meaning of the statement mentioned above.
when the character is ' " ' then i get a finite answer. and when the character is ' ' ' then too answer is a finite number. but i dont understand what the above bold text means....
my code
function charnum = char_counter(fname,character)
fid=fopen(fname);
if fid< 0
charnum = -1;
return;
end
if strcmp(character,'')==1
charnum=0;
return;
end
if double(character)>=35 && double(character)<=43 && double(character) ~=39 && double(character) ~= 41 && double(character) ~= 40
charnum = 0;
return;
end
if double(character) >=60 && double(character) <=64 && double(character) ~= 63
charnum = 0;
return;
end
if double(character) == 81 || double(character) == 88 || double(character) == 90
charnum = 0;
return;
end
cc = fgets(fid);
sumv=0;
while ischar(cc)
z = sprintf('%s',cc);
k = strfind(z,character);
sumv = sumv + length(k);
cc = fgets(fid);
end
charnum = sumv;
if charnum == 0
charnum =-1;
return;
end
3 Comments
Walter Roberson
on 29 Mar 2019
Why are you special-casing Q, X, Z ? Why are you special-casing the special characters?
Special-casing '' might be reasonable, but it looks to me as if none of those special cases are needed.
What is wrong is that when no copies of the character are detected, then because the sum will be 0, charnum will be assigned 0, and then your if charnum == 0 will be triggered, causing you to return -1. -1 should only be returned if there is a problem with the input you were given, and if the character simply is not found then the result should be 0.
Rakshith R
on 30 Mar 2019
Shubham Pandey
on 11 Apr 2020
Edited: Shubham Pandey
on 11 Apr 2020
The basic error this code is generating is that when you pass '' as character and if it reads 0 and stores it in charnum, this charnum is getting changed to -1 due to last if block. That is why, the error is showing up. Therefore, it is advisable to remove the last if block. Instead, you may add additional OR condition in the first if block to check for the validity of the character in addition to fid<0.
Accepted Answer
More Answers (4)
Jaimin Motavar
on 2 Jul 2019
can some tell me what is the my mistake in this code?problem is written in comment secssion.
function charnum = char_counter(filename,b)
charnum=0;
if ~ischar(b)
charnum=-1;
return;
end
fid = fopen(filename,'rt');
if fid<0
charnum=-1;
return;
end
oneline= fgets(fid);
while ischar(oneline)
a=sprintf('%s \n',oneline);
c=findstr(b,a);
[m,n]=size(c);
charnum=charnum+n;
oneline=fgets(fid);
end
end
3 Comments
Jaimin Motavar
on 2 Jul 2019
.png)
Ajith Thomas
on 19 Aug 2019
can you tell me the function of fgets here?
Walter Roberson
on 19 Aug 2019
fgets reads one line from the file including any delimiter
Ajith Thomas
on 19 Aug 2019
Edited: Ajith Thomas
on 19 Aug 2019
0 votes
my question is which all characters should be eliminated? on this question?
2 Comments
Walter Roberson
on 19 Aug 2019
There are different versions of the assignment around. In the most common case, there are no characters that should be eliminated. The tests against Q V and so on were hacks to deal code mistakes the user had made.
A common mistake people make is that they are returning -1 when a valid input is not found. They should be returning 0 instead. -1 is reserved for file not found or invalid input argument.
Walter Roberson
on 22 Aug 2019
Hint: you do not need to attempt the fopen() if a is not a char.
Preethi Vannal
on 12 Apr 2020
I passed 3 assessments out of 4 for this same question.
My code:
function charnum = char_counter(fname,ch)
if isfile(fname)
fid=fopen(fname,'rt')
if (fid>0 && ischar(ch))
ct=0;
oneline=fgets(fid);
while ischar(oneline)
if(strfind(oneline,ch))
ct=ct+count(oneline,ch);
else
charnum=-1;
end
oneline=fgets(fid);
end
charnum=ct;
else
charnum=-1;
end
else
charnum=0;
end
fclose(fid);
end
I am not able to get idea to pass this 4th assessment.
Can anyone please help me?
4 Comments
Walter Roberson
on 12 Apr 2020
If isfile() fails then you return charnum=0 but the assignment requires charnum -1 for that case.
if(strfind(oneline,ch))
ct=ct+count(oneline,ch);
else
charnum=-1;
end
What is the reason you are setting charnum if you do not happen to find the desired character on one particular line?
Stephen23
on 13 Apr 2020
@Preethi Vannal : you should replace the two if statements with one:
if fid<3 || ~ischar(ch)
...
else
...
end
Mohymen Kushal
on 2 Nov 2020
Don't close the file. fopen will return -1 if the file dosen't exist. But if you close it with fclose it won't.
Walter Roberson
on 2 Nov 2020
It is good practice to fclose() any file you fopen() unless you are returning the handle of the file (or recording it internally.)
However, the code posted attempts to fclose() the file even if the exist() test failed, which is a problem because if exist() failed then the variable fid would not have been assigned to.
tshering lhamo
on 5 Sep 2020
Edited: Rik
on 5 Sep 2020
hello, my function gives the error "test with all visible characters-failed". please help me understand where I made a mistake. thank you!
function charnum=char_counter(fname,character)
fid=fopen(fname,'rt');
if ~ischar(character)||fid<0
fprintf('error opening file\n');
charnum=-1;
return;
else
fname=fgets(fid);
charnum=0;
for ii=1:length(fname)
char_n=count(fname(ii),character);
charnum=charnum+char_n;
end
end
fclose(fid);
1 Comment
Rik
on 5 Sep 2020
You don't close the file if the character input is invalid, and you only read a single line. Also, as you're going character by character you don't really need the count function. And why do you store the file contents in fname? That name doesn't describe the contents at all.
This question is closed.
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!