строка :: найти не находит соответствия - PullRequest
1 голос
/ 06 июня 2011

Я пытаюсь использовать метод string :: find, чтобы определить, существует ли строка «hello» (с пробелом до и после) в строке файла .txt.если это так, он должен распечатать номер строки (позиция не важна).проблема в том, что он не находит строку.пожалуйста, помогите.

int main() {
    string key (" hello ");
    ifstream myReadFile;
    myReadFile.open("test.txt");
    string s;
    int lineCount = 1;
    int found;
    if (myReadFile.is_open()) {
        while (!myReadFile.eof()) {
            getline(myReadFile, s);
            found = s.find(key);
            if(found != string::npos) {
                cout<<lineCount<<endl;
                lineCount++;
            }
         }
    }
    myReadFile.close();
    return 0;
}

Ответы [ 3 ]

2 голосов
/ 06 июня 2011

Если проблема, с которой вы сталкиваетесь, заключается в том, что ваша программа всегда печатает 1, 2, 3, ... вместо правильных номеров строк, то это потому, что вы увеличиваете lineCount, только если подстрока была найдена;чтобы исправить это, переместите lineCount++ после блока if(found != string::npos).

Если вы вообще не видите никаких выходных данных, либо файл не содержит " hello " (регистр имеет значение, а также эти пробелысимволы не будут совпадать с другими пробелами) или «test.txt» не в нужном месте или имеет неправильное имя.

ПРИМЕЧАНИЕ. Сравнение между found и string::npos здесь можно (дажехотя один из них является int со знаком, а другой - size_t (вероятно, unsigned int или, возможно, unsigned long long в 64-разрядной системе). Интересно, что он сломается, если вы измените found на unsigned intи size_t оказывается более широким типом без знака (на 32-разрядной машине вы можете смоделировать эту ситуацию, сделав found unsigned short). Поскольку вы на самом деле не используете значение found, этовероятно, лучше всего избегать конверсий и просто сделать if (s.find(key) != string::npos).

0 голосов
/ 06 июня 2011

То, что вы делаете, когда у вас есть это просто подсчет количества строк, в которых есть эта строка.Вы должны увеличивать номер строки var на каждой итерации цикла, а не только когда строка найдена.

int main() {
    std::string key (" hello ");
    ifstream myReadFile;
    myReadFile.open("test.txt");


    if (myReadFile) {

        std::string line;
        int line_number = 0;
        while (std::getline(myReadFile, line)) {
            line_number++;                
            if (line.find(key) != std::string::npos)
                std::cout << line_number << std::endl;
        }

    } else {
        std::cout << "Error opening file\n";
    }
}
0 голосов
/ 06 июня 2011

int found должно быть string::size_type.Это может быть вашей проблемой, так как int подписан, а size_t не подписан.См. string :: npos для получения дополнительной информации.

npos - это статическое постоянное значение элемента с максимально возможным значением для элемента типа size_t.

РЕДАКТИРОВАТЬ:

Благодаря комментариям Мартина я заменил size_t на string::size_type

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...