Я пытаюсь сделать функцию how_many(), которая подсчитывает количество символов определенного типа, например "\n" или "," в потоке файлов. Вот моя попытка:
int how_many(char mychar, anifstream myfile){
int result;
while(!myfile.eof())
{
if(myfile.get()==mychar){result=result+1;}
}
myfile.close(); // Closes the filestream "my file"
return result;
}
Первый вопрос: "\n" символ или строка? (Если это так, тогда я должен сделать первый ввод строки вместо символа)
Второй вопрос: можете ли вы объяснить возникшее сообщение об ошибке? (или, наоборот, прямо указать на неправильное использование синтаксиса в моем коде):
warning: result of comparison against a string literal is unspecified
(use strncmp instead) [-Wstring-compare]
note: candidate function not viable: no known conversion from 'const char [2]' to
'char' for 1st argument
"\n"
- это строковый литерал, который имеет тип const char[2]
и содержит два символа: '\n'
и '\0'
.
'\n'
- это символ символа escape-символа, который имеет тип char
.
Учтите, что result
переменной в вашей функции не был инициализирован.
'\n'
является символом, тогда как "\n"
является строковым литералом (типа const char[2]
последний для null)
Для подсчета предпочтительного алгоритма
#include <algorithm>
#include <iterator>
//..
std::size_t result = std::count( std::istream_iterator<char>(myfile),
std::istream_iterator<char>(),
mychar
) ;
Вы можете сделать гистограмму, пока вы читаете файл:
std::vector<char> character_counts(256); // Assuming ASCII characters
// ...
char c;
while (cin >> c) // The proper way to read in a character and check for eof
{
character_counts[c]++; // Increment the number of occurances of the character.
}
В том случае, если вы отправили сообщение, вы можете найти число "\n":
cout << "Number of \'\\n\' is: " << character_counts['\n'] << endl;