fstream in_file("dict.txt");
in_file.getline(wrd01, 20);
поиск слова в тектовом файле
И, раз уш на то пошло, подскажите пожалуйста:
Код:
Насколько я понял во второй строке 20 - это количество допустимых символов. Как это значение сделать динамическим? Заранее спасибо.
ЗЫ: еслиэто важно, компилятор gcc/g++.
Считать в бафер (char *) некоторую часть и читай мануал к strtok (<cstring>) имей ввиду, она имеет статические данные, разбирать 2 разных файла одновременно не выйдет. Прочтешь менуа, поймешь, что и как, там просто.
Цитата: 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;
}
#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).
А если у меня txt'шник, скажем, метров на 700? (ну, например, на самом деле он,кончно меньше, но мо-моему такой метод это не совсет то....)
если текущий символ равен первому символу искомой подстроки, начинаем сравнивать. если не дошли до конца подстроки и сравнение провалилось, ходим дальше по файлу. дошли до конца подстроки - значит нашли что надо :)
если встанет вопрос об ускорении поиска - нужно будет делать чтение блоками, обрабатывая ситуация когда граница блока может разорвать подстроку.
А если блоками? скажим, до ';'?, и как зацепить строку или символ из файла до определённого символа?
потому что по точной постановке можно будет подобрать самый подходящий способ для тебя
--
под блоками я имел ввиду чтение блоками по 1024 символа например.
читается быстрее, чем по 1 символу
Цитата: St0p
А если блоками? скажим, до ';'?, и как зацепить строку или символ из файла до определённого символа?
std::getline
см. на делиметер (3й аргумент)
Код:
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>]
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;
}
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;
}
возможно, я где-то что-то и напутал, но это не повод вот так на меня ругаться.. Помогите, плз) Заранее спасибо.
оффтоп: автор, если вы используете Линукс, почему бы просто не залезть в исходники grep?
squirL, А если я нехочу копипастить чужой сырок, а хочу состряпать свой? Я же не за бугор его продать хочу, а учусь тока!..
кто сказал про копи-паст? я сказал про изучение чужих исходников. изучение чужих сырцов - один из ключевых моментов обучения программированию.
тогда вопрос: где он (: нашел тока бинарик)
спасибо)) а касательно ошибки этой?