Это то, что я имею до сих пор; Я пытаюсь получить массив с вероятностью всех символов и пробела в текстовом файле, но у меня проблема с типом данных.
int main()
{
float x[27];
unsigned sum = 0;
struct Count {
unsigned n;
void print(unsigned index, unsigned total) {
char c = (char)index;
if (isprint(c)) cout << "'" << c << "'";
else cout << "'\\" << index << "'";
cout << " occured " << n << "/" << total << " times";
cout << ", propability is " << (double)n / total << "\n";
}
Count() : n() {}
} count[256];
ifstream myfile("C:\\text.txt"); // one \ masks the other
while (!myfile.eof()) {
char c;
myfile.get(c);
if (!myfile) break;
sum++;
count[(unsigned char)c].n++;
}
for (unsigned i = 0; i<256; i++)
{
count[i].print(i, sum);
}
x[0] = count[33];
int j=68;
for(int i=1;i<27;i++)
{
x[i]=count[j];
j++;
}
return 0;
}
#include <iostream>
#include <fstream>
#include <cctype>
using namespace std;
double probabilities[256]; // now it can be accessed by Count
int main()
{
unsigned sum = 0;
struct Count {
unsigned n;
double prob;
void print ( unsigned index, unsigned total ) {
// if ( ! n ) return;
probabilities[index] = prob = (double)n/total;
char c = (char) index;
if ( isprint(c) ) cout << "'" << c << "'";
else cout << "'\\" << index << "'";
cout<<" seen "<<n<<"/"<<total<<" times, probability is "<<prob<<endl;
}
Count(): n(), prob() {}
operator double() const { return prob; }
operator float() const { return (float)prob; }
} count[256];
ifstream myfile("C:\\text.txt"); // one \ masks the other
while(!myfile.eof()) {
char c;
myfile.get(c);
if ( !myfile ) break;
sum++;
count[(unsigned char)c].n++;
}
for ( unsigned i=0; i<256; i++ ) count[i].print(i,sum);
return 0;
}
Я включил различные предложенные изменения — Спасибо!
Теперь, кто находит 4 способа получить доступ к фактическим вероятностям?
Вы выделяете буфер с размером 1000000
1 миллион символов
char file[1000000] = "C:\text.txt";
Это не хорошо, поскольку дополнительные значения в буфере не гарантируются равными нулю, они могут быть чем угодно.
Чтобы Windows прочитал файл, вам нужно что-то вроде этого. Я не буду давать вам решение, вам нужно научиться использовать msdn и документацию, чтобы понять это полностью:
вам нужно включить #include <windows.h>
заголовок из SDK первым.
Посмотрите на этот пример здесь: http://msdn.microsoft.com/en-us/library/windows/desktop/aa363778(v=vs.85).aspx
этот пример как добавление файла к другому. Ваше решение будет аналогичным, вместо записи списка в другой файл, обработайте буфер, чтобы увеличить ваши локальные переменные и обновить состояние таблицы.
Не устанавливайте большое число, которое вы придумали для буфера, так как существует риск нехватки буферного пространства и, следовательно, переполнения. Вы должны сделать как пример:
повторяйте, пока не дойдете до конца файла
while (ReadFile(hFile, buff, sizeof(buff), &dwBytesRead, NULL)
&& dwBytesRead > 0)
{
// write you logic here
}