массивы — таблица частот в переполнении стека

Это то, что я имею до сих пор; Я пытаюсь получить массив с вероятностью всех символов и пробела в текстовом файле, но у меня проблема с типом данных.

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;
}

-3

Решение

#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 способа получить доступ к фактическим вероятностям?

2

Другие решения

Вы выделяете буфер с размером 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
    }

0

По вопросам рекламы [email protected]