Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

поиск слова в тектовом файле

12K
15 апреля 2007 года
St0p
59 / / 15.04.2007
Такая проблемма: я хоть убейте немогу понять как найти определёную строку/слово в нужном текстовом файле. За 3 дня попыток решения этой задачи проштудировал тонны мукулатуры. Понял тока как с помощью fstream выцыпить первую строчку этого файла.. Остальное мне пока не даётся)) Помогите плз))
И, раз уш на то пошло, подскажите пожалуйста:
 
Код:
fstream in_file("dict.txt");
    in_file.getline(wrd01, 20);

Насколько я понял во второй строке 20 - это количество допустимых символов. Как это значение сделать динамическим? Заранее спасибо.
ЗЫ: еслиэто важно, компилятор gcc/g++.
602
15 апреля 2007 года
KPI Student
265 / / 16.12.2006
Считать в бафер (char *) некоторую часть и читай мануал к strtok (<cstring>) имей ввиду, она имеет статические данные, разбирать 2 разных файла одновременно не выйдет. Прочтешь менуа, поймешь, что и как, там просто.
320
15 апреля 2007 года
m_Valery
1.0K / / 08.01.2007
Цитата: St0p
Такая проблемма: я хоть убейте немогу понять как найти определёную строку/слово в нужном текстовом файле. За 3 дня попыток решения этой задачи проштудировал тонны мукулатуры...


Не надо штудировать макулатуру:D Найди нормальную книгу по С++,
ее и штудируй.Например : Стэнли Липпман,Жози Лажойе
Язык программирования С++.Вводный курс. или Стэнли Липпман
С++ для начинающих.У него там примеров по чтению файлов,созданию
словарей,поиска и т.д. вагон.В самом общем случае можно сделать так.

Код:
#include <iostream>
#include <fstream>
#include <string>
#include <vector>

using namespace std;

int _tmain(int argc, _TCHAR* argv[])
{
    vector<string> words;
    string textline,file_name;
    cout<<"Input file path ..."<<endl;
    cin>>file_name;
    ifstream infile(file_name.c_str(),ios::in);
    if(!infile){
               cerr<<"Error..."<<endl;
    }else cout<<endl;
    while(getline(infile,textline,' ')){
        words.push_back(textline);
    }
    cout<<"Open file"<<endl;
    for(int i = 0;i<words.size();++i){
        cout<<words<<' ';
    }
    string str;
    cout<<"Input word"<<endl;
    cin>>str;
    int count = 0;
    for(int i = 0;i<words.size();++i){
        if(words == str){
          ++count;
        }
    }
    if(count)
        cout<<"results : "<<count<<" words"<<endl;
    else
        cout<<"not found"<<endl;
    return 0;
}

Т.е. загоняешь все в вектор и потом ищешь.Можно использовать один
из обобщенных алгоритмов поиска(STL).
12K
20 апреля 2007 года
St0p
59 / / 15.04.2007
А если у меня txt'шник, скажем, метров на 700? (ну, например, на самом деле он,кончно меньше, но мо-моему такой метод это не совсет то....)
18K
20 апреля 2007 года
dave
35 / / 12.12.2006
в таком случае посимвольно читаем
если текущий символ равен первому символу искомой подстроки, начинаем сравнивать. если не дошли до конца подстроки и сравнение провалилось, ходим дальше по файлу. дошли до конца подстроки - значит нашли что надо :)

если встанет вопрос об ускорении поиска - нужно будет делать чтение блоками, обрабатывая ситуация когда граница блока может разорвать подстроку.
12K
20 апреля 2007 года
St0p
59 / / 15.04.2007
А если блоками? скажим, до ';'?, и как зацепить строку или символ из файла до определённого символа?
18K
20 апреля 2007 года
dave
35 / / 12.12.2006
дай точную задачу - формат файла, разделяющие символы....
потому что по точной постановке можно будет подобрать самый подходящий способ для тебя

--
под блоками я имел ввиду чтение блоками по 1024 символа например.
читается быстрее, чем по 1 символу
3
20 апреля 2007 года
Green
4.8K / / 20.01.2000
Цитата: St0p
А если блоками? скажим, до ';'?, и как зацепить строку или символ из файла до определённого символа?


std::getline
см. на делиметер (3й аргумент)

12K
21 апреля 2007 года
St0p
59 / / 15.04.2007
Ну, вобщем, написал, вроде, правдо не тестил, ибо вот какая штука получается:
 
Код:
bash-3.1 $  g++ -o dict.out dict.cpp
In file included from /usr/lib/gcc/i486-slackware-linux/3.4.6/../../../../include/c++/3.4.6/backward/fstream.h:31,
                 from dict.cpp:5:
/usr/lib/gcc/i486-slackware-linux/3.4.6/../../../../include/c++/3.4.6/backward/backward_warning.h:32:2: warning: #warning This file includes at least one deprecated or antiquated header. Please consider using one of the 32 headers found in section 17.4.1.2 of the C++ standard. Examples include substituting the <X> header for the <X.h> header for C++ includes, or <iostream> instead of the deprecated header <iostream.h>. To disable this warning use -Wno-deprecated.
dict.cpp: In function `int main()':
dict.cpp:15: error: no matching function for call to `std::basic_fstream<char, std::char_traits<char> >::getline(std::string&, int)'
/usr/lib/gcc/i486-slackware-linux/3.4.6/../../../../include/c++/3.4.6/bits/istream.tcc:582: note: candidates are: std::basic_istream<_CharT, _Traits>& std::basic_istream<_CharT, _Traits>::getline(_CharT*, std::streamsize, _CharT) [with _CharT = char, _Traits = std::char_traits<char>]
/usr/lib/gcc/i486-slackware-linux/3.4.6/../../../../include/c++/3.4.6/istream:399: note:                 std::basic_istream<_CharT, _Traits>& std::basic_istream<_CharT, _Traits>::getline(_CharT*, std::streamsize) [with _CharT = char, _Traits = std::char_traits<char>]

Это, как видно я получаю при попытке скомпилить этот самый исходник компилятором gcc/g++(Linux).. И меня это не радует... Подскажите пожалуйста, что случилось? Исходник вот он:
Код:
int main() {
    string str01, str02, str03_buf;
    fstream file_op("dict.txt");
    cout<<"Vvedite slovo : "<<endl;
    cin>>str01;
    while(file_op.eof()) {
        file_op.getline(str02, 300);
        int i=0;
        while(str02!='=') {
            str03_buf=str02;
            i++;
        }
        if(str01==str03_buf) {
            while(str02!=';') {
                cout<<str02;
                i++;
            }
        }
    }
    cout<<endl;
    return 0;
}

возможно, я где-то что-то и напутал, но это не повод вот так на меня ругаться.. Помогите, плз) Заранее спасибо.
2
21 апреля 2007 года
squirL
5.6K / / 13.08.2003
оффтоп: автор, если вы используете Линукс, почему бы просто не залезть в исходники grep?
12K
21 апреля 2007 года
St0p
59 / / 15.04.2007
squirL, А если я нехочу копипастить чужой сырок, а хочу состряпать свой? Я же не за бугор его продать хочу, а учусь тока!..
2
21 апреля 2007 года
squirL
5.6K / / 13.08.2003
кто сказал про копи-паст? я сказал про изучение чужих исходников. изучение чужих сырцов - один из ключевых моментов обучения программированию.
12K
21 апреля 2007 года
St0p
59 / / 15.04.2007
тогда вопрос: где он (: нашел тока бинарик)
12K
22 апреля 2007 года
St0p
59 / / 15.04.2007
спасибо)) а касательно ошибки этой?
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог