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


Автор: getUp 23.10.2009, 18:29
подскажите почему не получается найти строку words = word1 + ' ' + word2

Код



#include "stdafx.h"
#include "fstream"
#include <iostream>
#include <stdio.h>
#include <conio.h>
#include <locale.h>
#include <string>

using namespace std; 

void main()
{
    setlocale(LC_ALL,"russian");
    string word1;
    string word2;
    string words;
    string current_str;
    cin >> word1;
    cin >> word2;
    
             words=word1+' '+word2;
    
    ifstream file("D:\\F.txt");

    while(!(file.eof()))
    { 
        getline(file, current_str, ' ');
        
        if (word1.compare(current_str)==NULL)
            cout<<"нашлось 1е слово ";
        
        if (word2.compare(current_str)==NULL)
            cout<<"нашлось 2е слово";
    }

    while(!(file.eof()))
    { 
        getline(file, current_str);
        if (words.compare(current_str)==NULL)
                     cout<<"слова рядом через пробел";
    }

    getch();
}



Автор: niXman 23.10.2009, 18:37
Код

#include <iostream>
#include <locale.h>
#include <string>
using namespace std; 

int main() {
    setlocale(LC_ALL,"russian");
    string word1;
    string word2;
    string words;
    string current_str;
    cin >> word1;
    cin >> word2;
    
    words=word1+' '+word2;
    
    ifstream file("D:\\F.txt");
    while( !file.eof() ) {
        getline(file, current_str, ' ');
        
        if (word1 == current_str)
            cout<<"нашлось 1е слово ";
        
        if (word2 == current_str)
            cout<<"нашлось 2е слово";
    }
    while( !file.eof() ) {
        getline(file, current_str);
        if (words == current_str)
                     cout<<"слова рядом через пробел";
    }
    
    cin >> words;
    
    return 0;
}


Автор: getUp 23.10.2009, 19:09
не понял... то что вы мне написали работает точно также как и мой вариант
и зачем нужно cin >> words в конце?

мне нужно сделать следующее: выполнить поиск 1ого слова в файле, выполнить поиск 2ого слова в том же файле, и найти эти слова разделенные пробелом (что у меня и не получается). слова по отдельности ищет отлично

Автор: niXman 23.10.2009, 19:34
Цитата(getUp @  23.10.2009,  17:09 Найти цитируемый пост)
то что вы мне написали работает точно также как и мой вариант

Я показал как правильно сравнивать строки.

Цитата(getUp @  23.10.2009,  17:09 Найти цитируемый пост)
и зачем нужно cin >> words в конце?

Вместо getch(). Если пишешь на С++, то для чего использовать функции из Си?

Цитата(getUp @  23.10.2009,  17:09 Найти цитируемый пост)
найти эти слова разделенные пробелом (что у меня и не получается)

Возможно их там попросту нет.

Добавлено @ 19:36
Йоу. Перепозиционироваться забыл.
Код

#include <iostream>
#include <locale.h>
#include <string>
using namespace std; 
int main() {
    setlocale(LC_ALL,"russian");
    string word1;
    string word2;
    string words;
    string current_str;
    cin >> word1;
    cin >> word2;
    
    words=word1+' '+word2;
    
    ifstream file("D:\\F.txt");
    while( !file.eof() ) {
        getline(file, current_str, ' ');
        
        if (word1 == current_str)
            cout<<"нашлось 1е слово ";
        
        if (word2 == current_str)
            cout<<"нашлось 2е слово";
    }
    file.seekg(0); /** <<<<<<<<<<<<<<<<<<<<<<<< */
    while( !file.eof() ) {
        getline(file, current_str);
        if (words == current_str)
                     cout<<"слова рядом через пробел";
    }
    
    cin >> words;
    
    return 0;
}


Автор: getUp 23.10.2009, 19:46
Цитата

Возможно их там попросту нет.

есть! в файл записал 3 слова: "word", "world" и "work". все слова записаны через пробел.

в ходе выполнения программы ввожу:
word
world

в результате вижу следующее:
нашлось 1е слово нашлось 2е слово

чего не хватает:
слова рядом через пробел

Автор: niXman 23.10.2009, 19:52
Цитата(niXman @  23.10.2009,  17:34 Найти цитируемый пост)
Йоу. Перепозиционироваться забыл.


Добавлено через 2 минуты и 32 секунды
После этого:
Код

getline(file, current_str);

что находится в current_str ?

Автор: getUp 23.10.2009, 19:57
поменял это:
Код

file.seekg(0);
    while( !file.eof() ) {
        getline(file, current_str);
        if (words == current_str)
                     cout<<"слова рядом через пробел";
    }

на это:
Код


file.seekg(0);
    while( !file.eof() ) {
        getline(file, current_str, ',');
        if (words == current_str)
                     cout<<"слова рядом через пробел";
    }


в файле поставил запятую после слова world. в ходе выполнения программы ввел "word" и "world".
все нашлось так как поиск шел до запятой, которая стояла после world.
как сделать чтобы работал без запятой?


в current_str помещается строка из потока file

Автор: LigLink 25.10.2009, 21:44
getUp, функция string::compare в твоем случае работает не так как хотелось-бы.
То же относительно оператора "==".


Вот ссылка почитай об использовании  string::compare и посмотри примеры. Все станет намного понятнее.
http://www.cplusplus.com/reference/string/string/compare/

а вот то, что может помочь решить твою проблему:
http://www.cplusplus.com/reference/string/string/find/

При этом обрати внимание на возвращаемое значение функции, и не забудь  учесть его при составлении условий smile 

Автор: shuttle 26.10.2009, 06:52
запусти по шагам (F10) и посмотри какое значение будет в words.
Код

words=word1+' '+word2;

в этом выражении

Автор: LigLink 26.10.2009, 11:11
niXman, а при таком перепозиционировании ( file.seekg(0); )

у тебя срабатывает заход в цикл? у меня чет нет.

Автор: zim22 26.10.2009, 11:27
Цитата(LigLink @  26.10.2009,  11:11 Найти цитируемый пост)
у тебя срабатывает заход в цикл? у меня чет нет.

выход из цикла может произойти в связи с достижением конца файла или ошибкой ввода.
в любом случае поток будет установлен в недопустимое состояние.
сбросить поток так:
Код

имя_потока.clear()

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