Week 9, Assignment 2
Ältere Kommentare anzeigen
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. The function returns charnum, the number of characters found. If the file is not found or character is not a valid char, the function return -1. As an example, consider the following run. The file "simple.txt" contains a single line: "This file should have exactly three a-s...
function charnum=char_counter(fname,a)
fid=fopen(fname,'rt');
if fid<0
charnum=-1;
fprintf('error\n');
return;
end
if ischar('a')==0
return;
end
if fid>0 && ischar(a)
line=fgets(fid);
n=0;
for n=n+count(line,a)
end
charnum=n;
else charnum=-1;
end
if ischar(a)==0
charnum =-1;
elseif charnum==0
charnum=0;
return;
end
fclose(fid);
why second error is coming?

6 Kommentare
Not sure about anything else, but at a glance
if ischar('a')==0
return;
end
does nothing. I assume you wanted to test if a is a char, in which case
if ~ischar( a )
return
end
would do this. Your version tests if 'a' is a char, which it always is, and returns if it isn't (which obviously never happens).
I have no idea what is in your file though for that test. I assume ' ' should count the number of spaces so unless there is only 1 space then yes, your code would be wrong.
Also this is a very odd construct. Off the top of my head I can't work out what this for loop is expecting to do:
for n=n+count(line,a)
end
Joel Handy
am 19 Aug. 2019
As Adam pointed out, the for loop where you are trying to do your actual count is not correct. unless you have something inside your for loop, it will do next to nothing. I think what really want here is while loop that keeps reading new lines and counting characters until you get to the end of the file.
There are even better ways to do this. You can actually read the entire file as one big string
The other problem I think you are having is that an empty string '' is still a character vecter and ishcar will return true. This however is probaly not considered a valid character for the purposes of this assignment. You may want to look into the isempty function.
Guillaume
am 19 Aug. 2019
There are many things that don't make sense in the code. Writing code by trial and error is not a very good approach. Think before writing.
- if you test that the file is valid and return if it isn't, there's no point testig for validity after that. You know that if the code proceeds the file is valid
- Similarly, if you test that the input is a character and return if not, there's no point testing for it afterward
- Inventing your own syntax for for loops is not going to work
- Testing if something is 0 and setting it to 0 if is, is not particarly useful.
- once you succesfully fopen a file, you have to be careful to always fclose it, regardless of what your code does. In particular, if you call return before fclose, your file will be left open.
Guillaume
am 19 Aug. 2019
Ajith's comment mistakenly posted as an answer moved here:
function charnum=char_counter(fname,a)
fid=fopen(fname,'rt');
if fid<0 || ischar(a)==0 || ~isempty(a)==0
charnum=-1;
return;
end
if double(a)==32
charnum=0;
return;
end
if fid>0 && ischar(a)
line=fgets(fid);
n=0;
for n=n+count(line,a)
end
charnum=n;
end
if charnum==0
charnum=0;
end
fclose(fid);
and the solution gives 0 in return. This is the error em getting right now
my question is which all characters should be eliminated?
Guillaume
am 19 Aug. 2019
The code is much better. However,
- if the file is valid (fid >= 0) but a is not, you quit the function without closing the file
- double(a) == 32 is exactly the same as a == ' '. The latter is a lot clearer as to the intent.
- Your for loop doesn't make any sense. By chance, your function will produce the correct result if the input has one line only.
- Again, testing if something is 0 and then setting it to 0 if it is, doesn't make sense.
my question is which all characters should be eliminated
Why should any of them be eliminated?
Steven Lord
am 19 Aug. 2019
Why is the space character not a valid character? Nothing in the text of the assignment that you've posted says it's invalid.
By the way, I agree with Guillaume that a == ' ' is a clearer statement of intent. Calling the isspace function is even clearer, though it may be a little more permissive about what's a space than you want (are tab, line feed, or newline spaces? They are to isspace.)
Antworten (1)
Raheem Ullah
am 17 Aug. 2022
function charnum=char_counter(fname,character)
fid=fopen(fname,'rt')
n=0
p=ischar(character)
if(fid<0 || p==0)
charnum=-1
return
else
oneline=fgets(fid)
while ischar(oneline)
for ii=1:length(oneline)
if(oneline(ii)==character)
n=n+1
end
end
oneline=fgets(fid)
end
end
charnum=n;
fclose(fid);
end

Kategorien
Mehr zu Text Data Preparation finden Sie in Hilfe-Center und File Exchange
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!