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


Автор: V0LT 21.7.2009, 09:37
Открываю файл и заполняю lst но он заполняется указателями на buf,
а не значениями в результате список состоит из одних и тех же значений и найти ничего нельзя  smile 

Код
void TransmuteFile()
{
    
    FILE *ff=fopen("test.txt","r+");
    std::list<char*> lst;

    if(ff!=NULL){
        while(!feof(ff))
        {
            char buf[MAX_LOADSTRING];
            fgets(buf,MAX_LOADSTRING,ff);
            lst.push_back(buf);
        }
        fclose(ff);
    
        char* tb;

        for(std::list<char*>::iterator it=lst.begin();it!=lst.end();++it)
        {
            tb = (char*) *it;
            if(strcmp(tb,"...")==0)
            lst.erase(it);
            
        }
    }
}


А цель всего мероприятия удалить из файла нужную строку как можно быстрее

Автор: mes 21.7.2009, 09:43
Цитата(V0LT @  21.7.2009,  08:37 Найти цитируемый пост)
 std::list<char*> 

такой лист не годится для вашей задачи. можно использовать list<string> со всеми вытекающими изменениями в коде.


Автор: V0LT 21.7.2009, 09:47
Цитата(mes @ 21.7.2009,  09:43)
Цитата(V0LT @  21.7.2009,  08:37 Найти цитируемый пост)
 std::list<char*> 

такой лист не годится для вашей задачи. можно использовать list<string> со всеми вытекающими изменениями в коде.

Пример хочу smile 

Автор: GoldFinch 21.7.2009, 09:57
V0LT, справку по std::string почитай, и будет тебе пример

Автор: mrbrooks 21.7.2009, 10:02
V0LT, + почему не используешь файловый ввод/вывод с стиле С++. Это удобней имхо чем в стиле С.


Цитата(V0LT @  21.7.2009,  09:47 Найти цитируемый пост)
Пример хочу

Поищи по форуму - сотни раз решался аналогичный вопрос - особенно в Центре Помощи

Автор: V0LT 21.7.2009, 11:29
уже лазил ... наткнулся на вот этот код ... но дальше обсуждение не зашло

Автор: mrbrooks 21.7.2009, 12:43
Цитата(V0LT @  21.7.2009,  11:29 Найти цитируемый пост)
уже лазил ... наткнулся на вот этот код ... но дальше обсуждение не зашло 

 smile 
как то не верится. 
загрузить можешь к примеру так:
Код

std::ifstream file("test.txt");
if (file) 
    std::list<std::string>list((std::istream_iterator<std::string>(file)),(std::istream_iterator<std::string>()));

Автор: ISergeyN 21.7.2009, 13:08
Если правильно всё понял то должно быть что то такое.
Код

#include <iostream>
#include <fstream>
#include <string>
#include <algorithm>
#include <iterator>
#include <list>


bool pred(const std::string &rhs){
    return rhs == "...";
}
int main()
{

    std::ifstream fs("file.txt");
    std::list<std::string> slist;
    if(fs.is_open()){
        std::copy(
            std::istream_iterator<std::string>(fs),
            std::istream_iterator<std::string>(),
            back_inserter(slist));
        fs.close();
    }

    std::copy(slist.begin(), slist.end(), std::ostream_iterator<std::string>(std::cout," "));

    slist.erase(
        std::remove_if(slist.begin(), slist.end(), pred),
        slist.end());

    std::cout << "\n----------------------------------------------------\n";
    std::copy(slist.begin(), slist.end(), std::ostream_iterator<std::string>(std::cout," "));

    std::cin.get();
    return 0 ;
}

Автор: mes 21.7.2009, 13:16
Цитата(ISergeyN @  21.7.2009,  12:08 Найти цитируемый пост)
bool pred(const std::string &rhs){
    return rhs == "...";
}

предикат, думаю Вам будет удобнее оформить в виде структуры/класса, тогда можно будет задавать строчку-образец, с которым необходимо сравнивать.

Автор: ISergeyN 21.7.2009, 13:31
Цитата(mes @  21.7.2009,  13:16 Найти цитируемый пост)
предикат, думаю Вам будет удобнее оформить в виде структуры/класса, тогда можно будет задавать строчку-образец, с которым необходимо сравнивать.

Ну да..
Вспомнил это
Код

std::remove_if(slist.begin(), slist.end(), pred)

можно заменить на 
Код

std::remove_if(slist.begin(), slist.end(), std::bind2nd(std::equal_to<std::string>(),"..."))

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