Member 13433705 Ответов: 1

Найти строку внутри более длинной строки


Привет,

В настоящее время у меня есть имя файла, в котором я хочу найти определенную строку, если это так, то я хочу выполнить конкретные задачи на основе того, какую подстроку я нашел.

Пример:

testdir была/ветчина/тест1.1
testDir/ham/test2. 2
testdir была/спам/test3.3
testdir была/спам/test4.4

Допустим, имя файла хранится в виде строки в файле "strFilename". Смогу ли я использовать strFilename.find("/ham/"), если захочу отделить папки HAM и SPAM? До сих пор в моем коде использование этого метода возвращало только все, кроме того, что я хочу.

Код:
<pre>int main(int argc, char* argv[] ) {

    int wordCount;
    int fileStrCount;
    int hamCount;
    int spamCount;
    
    set<string> seenWords;
    map<string, int> ham;
    map<string, int> spam;    



    if( argc < 2 ) {
        cout <<  "ERROR: Must have atleast one filename! \n";
    }
    //The user gives a path to a directory containing "index"
    //File is used to store filename and fList stores them
    string files = "";
    vector<string> fList;

    //Storing full path of directory to later add /index
    string pathToDir = argv[1];
    string pathToIndex = pathToDir + "index";
    ifstream dirIndex( pathToIndex );

    //Push back all filenames within index to fList
    while( getline( dirIndex, files ) ) {
        fList.push_back( files );
    }

    string thirdWord = "";




    //Iterate through filenames and open them 
    for(unsigned x = 0; x < fList.size(); x++) {
        string goHere = pathToDir + fList[x];
        ifstream fileToOpen( goHere );
        if( !fileToOpen.is_open() ) {
            cout << "Error: " << goHere << " cannot open!\n";
            return -1;
        }

        //Ignore first two lines
        fileToOpen.ignore( numeric_limits<streamsize>::max(), '\n' ); 
        fileToOpen.ignore( numeric_limits<streamsize>::max(), '\n' ); 
        cout << endl << goHere << endl;

        if( goHere.find("/ham/") == true ) { 
        while( getline( fileToOpen, thirdWord, ' ' ) ) {
            ++ham[thirdWord];
            ++hamCount;
            wordCount++;
        }
    } else {
            while(getline(fileToOpen, thirdWord, ' ') ) {
            ++spamCount;
            ++spam[thirdWord];
            wordCount++;
            }
           }

        cout << "Total Words In File: " << fileStrCount << endl;

        fileToOpen.close();
        fileToOpen.clear();




    }
    cout << endl << endl << endl << "HAM MAP\n";
    for(auto elem : ham)
    {
        cout << elem.first << " " << elem.second << "\n";
    }

     cout << endl << endl << endl << "SPAM MAP\n";
    for(auto elem : spam)
    {
        cout << elem.first << " " << elem.second << "\n";
    }

   

}


С основным акцентом здесь:
if( goHere.find("/ham/") == true ) { 
        while( getline( fileToOpen, thirdWord, ' ' ) ) {
            ++ham[thirdWord];
            ++hamCount;
            wordCount++;
        }
    } else {
            while(getline(fileToOpen, thirdWord, ' ') ) {
            ++spamCount;
            ++spam[thirdWord];
            wordCount++;
            }
           }


Что я уже пробовал:

Я пытался заглянуть в str:: substr (), но это тоже не то, что я хочу.

1 Ответов

Рейтинг:
12

Jochen Arndt

Вы выбрали подходящий string:: find-C++ Reference[^] функция, но пропустила, что она не возвращает логическое значение:

Цитата:
значение
Позиция первого символа первого матча.
Если совпадения не найдены, функция возвращает string:: NPO.
Таким образом, вы должны изменить свой код на:
if( goHere.find("/ham/") != string::npos )


CPallini

5.