Ciekawe zagadnienie dla zaawansowanych !!!

0

Witam :)

Jestem początkującym programistą w C++. Chciałbym zrobic program który by
policzył ile słów jest w pliku (to juz zrobiłem licząć spacje w pliku )
#include <iostream>
#include <fstream>

using namespace std;

main()
{

ifstream plikwej;
char buf;
int i=0;
plikwej.open("d://book.txt",ios::in);
while ( plikwej.get(buf) ){
if (buf==' ') i++;
}
cout << "Liczba slow (spacji) : " <<i<< endl;

plikwej.close();
return 0;
}

Ale chciałbym napisać program który by nie tylko policzył słowa w pliku
ale pokazałmi lub wygenerował drugi plik w którym by była statystyk
akażdego słowa np mając w pliku:
To jest ten tekst. Ten tekst.
powinien wygenerować:
To -1
jest -1
ten -2
tekst -2
moze byc rosnąco lub malejąco na razie nie ma to znaczenia.
Prosze o pomoc w napisaniu takiego programu lub udzielenia wskazówek jak
go napisać.
Jeżeli miałby ktoś program to bardzo prosiłbym o przysłanie mi źródeł.

Z poważanie MArcin Kotecki<font color="red"></span>

0
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <ctype.h>
#include <io.h>

struct textlist{
  textlist* nx;
  long      cn;
  char*     tx;
};

find(char* txt,textlist*& p){
  if(!p)return 0;
  textlist* t=p;
  do{
    if(!strcmp(p->tx,txt))return 1;
    p=p->nx;
  }while(p!=t);
  return 0;
}

void addline(char* txt,textlist*& p){
  if(find(txt,p)){
    p->cn++;
  }else{
    textlist* t=(textlist*)malloc(sizeof(textlist));
    t->tx=strdup(txt);
    t->cn=1;
    if(p){
      t->nx=p->nx;
      p->nx=t;
    }else t->nx=t;
    p=t;
  }
}

void load(char* name,textlist*& p){
  FILE* f=fopen(name,"rb");
  unsigned mls;
  unsigned ls=0;
  int a=-1;
  char* s=(char*)malloc((mls=128)+1);
  s[0]=0;
  char* b=(char*)malloc(1024);
  long l=filelength(fileno(f));
  while(l){
    unsigned j=1024;
    if(j>l)j=unsigned(l);
    fread(b,j,1,f);
    l-=j;
    unsigned i=0;
    while(i<j){
      int c;
      if(a^(c=isalpha(b[i]))){
        if(a && s[0]){
          addline(s,p);
          s[ls=0]=0;
        }
        a=c;
      }
      if(a){
        if(ls==mls)s=(char*)realloc(s,(mls<<=1)+1);
        s[ls++]=b[i];
        s[ls]=0;
      }
      i++;
    }
  }
  if(a && s[0])addline(s,p);
  free(s);
  free(b);
  fclose(f);
}

main(int argc,char** argv){
 textlist* p;
 load(argv[1],p=0);
 textlist* t=p->nx;
 p->nx=0;
 p=t;
 while(p){
   t=p->nx;
   printf("%s : %ld\n",p->tx,p->cn);
   free(p->tx);
   free(p);
   p=t;
 }
 return 0;
}

Jak chcesz do pliku to fprintf zamiast printf... I w tej samej petli mozesz sobie od razu posortowac.

0

Ewentualnie wykorzystujac STLa mozesz zrobic cos takigo :

#include <fstream>
#include <string>
#include <map>

using namespace std;

int main()
{
ifstream in("in.txt");
map<string,int> counter;
string tmp;

while (in >> tmp) counter[tmp]++;

ofstream out("out.txt");

for(map<string,int>::iterator iter = counter.begin() ; iter != counter.end() ; ++iter)
out << (*iter).first << " : " << (*iter).second << endl;

return EXIT_SUCCESS;
}

0

a ja bym to zrobil drzewem slownikowym, koniec kazdego slowa dal byl ilosc jego wystapien, jak chcesz to podaj maila na priwa to Ci wysle bo chyba gdzies mam

1 użytkowników online, w tym zalogowanych: 0, gości: 1