Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Общие вопросы > Посчитать количество


Автор: aToM1 21.1.2007, 09:35
Писал прогу, читающую текстовый файл с подсчетом количества встреченных слов:
Использовал STL(map): че здесь не правильно?
Код

#include <String.h>
           #include <iostream.h>
           #include "Map.h"
           int main()
           {
             Map<String,int> count;
             String word;
             while (cin >> word) count[word]++;
             for (Mapiter<String,int> p = count.first(); p; p++)
                 cout << p.value() << '\t' << p.key() << '\n';
             return 0;
           }


Второй вопрос: Как сделать так, чтобы прога выводила на экран список слов именно после! выполнения программы?
Т.е. мне нужна прога, считывающая файл(текстовый), далее подсчет слов (map), далее вывод результата на экран...
Прога, счит файл:
Код

FILE*f
f=fopen("Документ с текстом.doc","r");

Или как-то так?
Тупик в выводом на экран... Просто printf, что-ли?

Код

#include <string>
#include <iostream>
ifstream ifs;
ifs.open("1.doc.txt");

string str;
while (! ifs.eof())
{
    ifs >> str;
    cout << str << endl;
}

не пашет..Почему? Нашел компилятор ошибку 1...

Автор: zkv 21.1.2007, 10:02
Код

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

int main()
{
    std::map<std::string,int> count;
    std::string word;
    //в input.txt слова через пробел
    std::ifstream fileIn( "input.txt" );
    int i = 0;
    while ( !fileIn.eof() )
    {
        fileIn>>word;
        count[word] = i++;
    }
    fileIn.close();
    //напряжненно работаем с результатом
    //..
    //поработали - выводим
    for (std::map<std::string,int>::iterator p = count.begin(); p != count.end(); p++)
        std::cout<<p->first<<'\t'<<p->second<<'\n';
}

Автор: aToM1 21.1.2007, 16:12
Цитата(zkv @ 21.1.2007,  10:02)
Код

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

int main()
{
    std::map<std::string,int> count;
    std::string word;
    //в input.txt слова через пробел
    std::ifstream fileIn( "input.txt" );
    int i = 0;
    while ( !fileIn.eof() )
    {
        fileIn>>word;
        count[word] = i++;
    }
    fileIn.close();
    //напряжненно работаем с результатом
    //..
    //поработали - выводим
    for (std::map<std::string,int>::iterator p = count.begin(); p != count.end(); p++)
        std::cout<<p->first<<'\t'<<p->second<<'\n';
}

Че-то не пашет... У меня выводит: "no matching symbolic information found."...
Предложения?
Текстовый документ в той же папке...

Автор: KpoHyc 21.1.2007, 16:15
aToM1, а зачем на STL ?  можно и из консоли - или это принципиально?

Добавлено @ 16:17 
Код

#include <string.h>
#include <stdio.h>

char string1[] =
    "A string\tof ,,tokens\nand some  more tokens";
char string2[] =
    "Another string\n\tparsed at the same time.";
char seps[]   = " ,\t\n";
char *token1,
     *token2,
     *next_token1,
     *next_token2;

int main( void )
{
    printf( "Tokens:\n" );

    // Establish string and get the first token: 
    token1 = strtok_s( string1, seps, &next_token1);
    token2 = strtok_s ( string2, seps, &next_token2);

    // While there are tokens in "string1" or "string2"
    while ((token1 != NULL) || (token2 != NULL))
    {
        // Get next token:
        if (token1 != NULL)
        {
            printf( " %s\n", token1 );
            token1 = strtok_s( NULL, seps, &next_token1);
        }
        if (token2 != NULL)
        {
            printf("        %s\n", token2 );
            token2 = strtok_s (NULL, seps, &next_token2); 
        }
    }
}


это пример из MSDN в пять минут исправляется под твои нужды...

Автор: zkv 21.1.2007, 16:24
Цитата(aToM1 @  21.1.2007,  16:12 Найти цитируемый пост)
Че-то не пашет... У меня выводит: "no matching symbolic information found."...

кто выводит smile, и где? Проек компилируется? Компилятор какой? я же не телепат smile 
может задержку перед завершением работы надо поставить типа std::cin.get()
и вообще я пример этот привел как пример работы с std::map

Автор: Dov 21.1.2007, 17:17
Цитата(aToM1 @  21.1.2007,  08:35 Найти цитируемый пост)
Тупик в выводом на экран... Просто printf, что-ли?

А почему бы и нет? Ну, так, например. 
Код
#include<stdio.h>

int main()
{
    FILE* fileIn;
    char  word[80];
    int   count = 0;
    
    fileIn = fopen("input.txt", "r");

    while(fscanf(fileIn, "%s", word) != EOF)
        count++;
    printf("count = %d\n\n", count);

    fseek( fileIn, 0L, SEEK_SET );
    while(fscanf(fileIn, "%s", word) != EOF)
        printf("%s\n", word);    

    return 0;
}


Автор: GIK 21.1.2007, 22:52
Помойму, как то совсем не логично подщитывать повторы в mapе.
Вот написал кое что, но работает не корректно, т.к.  if(st[j]==mapIn[i].c_str())   помойму не сравнивает строки??? Ну и для подсчета, можно былобы использовать динамический массив, так что и некрасиво еще.......  smile 
Но щитает   smile 
Код

#include<string>
#include<map>
#include<iostream>
#include<stdio>
#include <conio>


 using namespace std;

int main(int argc, char* argv[])
{
  string st[12];
  string ranStr;
  int sousou[]={0,0,0,0,0,0,0,0,0,0,0,0}; 
              
  map<int,string> mapIn;
  map<int,string>::iterator mIt;
  mIt=mapIn.begin();
  int i=0;
  bool bul = false; // 
  while(cin>>ranStr && i!=12){
    mapIn.insert(pair<int, string>(i, ranStr));

    for(int j=0; j<12; j++){ 
      mIt=mapIn.find(i);
      if(st[j]==mapIn[i].c_str()) //mIt->second)
        {break; bul=true;} //
      else{continue;} 
    }
    if(!bul){st[i]=ranStr;}
     mapIn[i]=ranStr;

    i++;
    mIt++;
    bul=false;
  }

  for(int i=0; i<12; i++){
   cout<< st[i] <<endl;
  }

  for(int p=0; p<12; p++)
   for(int j=0; j<12; j++){
   if(mapIn[j]==st[p]) 
    {
      sousou[p]++; 
    }
   }
  for(int p=0; p<12; p++){
   cout<<"ellement";
   cout<<st[p];
   cout<<"imeet";
   cout<<sousou[p];
   cout<<"povtorov"<<endl;

  }

    getch();
        return 0;
}

Автор: aToM1 22.1.2007, 00:37
Цитата(KpoHyc @ 21.1.2007,  16:15)
aToM1, а зачем на STL ?  можно и из консоли - или это принципиально?


Очень желательно... на тему: "списки в STL (map)"

Добавлено @ 00:43 
У Debuga один ответ - "Expresion stream!=NULL"
компилятор кричит:no matching symbolic information found.
11.exe' has exited with code 3 (0x3).

Автор: sergejzr 3.2.2007, 12:28
Цитата(GIK @  21.1.2007,  21:52 Найти цитируемый пост)
Помойму, как то совсем не логично подщитывать повторы в mapе.

Это не только очень логично, но и является оптимальным решением данной проблемы.

ПС: Код подправил. Лежит http://forum.vingrad.ru/index.php?showtopic=135050&view=findpost&p=1022795.

Добавлено @ 12:32 
Да и: Модератор: Название темы должно отражать ее суть!

Автор: ip127001 3.2.2007, 14:35
Вот что я накинул...
Код

//---------------------------------------------------------------------------
#include<iostream.h>
#include<map>
#include<conio>
#include<fstream>
#pragma hdrstop

//---------------------------------------------------------------------------
typedef map<string,short> Tcount;
#pragma argsused
int main(int argc, char* argv[])
{
     ifstream openFile("1.txt");
        if (!openFile)
        {
           cerr<<"Error open file!!!";
           return -1;
        }
     Tcount *words_=new Tcount;
     short i_=0;
     string word;
        while (!openFile.eof())
        {
           openFile>>word;
           words_->insert(Tcount::value_type(word,i_++));
        }
       openFile.close();
       cout<<words_->size();
       delete words_;
        getch();
        return 0;
}

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)