Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Удаления из файла данных (C++)

4.7K
29 октября 2007 года
bobik02
140 / / 11.09.2007
Есть вопрос, например записываю я в файл таким образом:
Код:
#include <iostream>
#include <fstream>
#include <string>
 
using namespace std;
 
int main()
{
 
  ofstream tester("test.dat",  ios::app );
 
  string name;
 
  cout<<"Enter name: "<<endl;
 
  cin >>name;
 
  tester << name <<endl;
 
  return 0;
 
}

допустим ввел я несколько раз, и получился такой файл:
test.dat :
 
Код:
Tuzik
Shurik
Bobik
Sharik
Ivanov


например я хочу удалить от туда запись Bobik или любую другую ...

как можно сделать ? может сущетвует кой алгоритм удаления или надо мудрувать ?
1.9K
29 октября 2007 года
max_dark
256 / / 11.11.2005
Алгоритм зависит от того, по каким критериям ты будешь удалять запись: по номеру или по совпадению строк
Так что давай конкретнее
4.7K
29 октября 2007 года
bobik02
140 / / 11.09.2007
Цитата: max_dark
Алгоритм зависит от того, по каким критериям ты будешь удалять запись: по номеру или по совпадению строк
Так что давай конкретнее



впринцыпе все равно:p и вариант с удалением по сурагатному ключу или по совпаденю строк подходит

1.9K
29 октября 2007 года
max_dark
256 / / 11.11.2005
По номеру:
Код:
#include <iostream>
#include <fstream>
#include <string>
 
using namespace std;
 
int main()
{
    ifstream  in ("test.dat",  ios::in);
    ofstream out("test.new", ios::out);
    char buff[256];
    int num,i;

    cout<<"Enter number: "<<endl; cin >>num;
    i=0;
    while(!in.eof()) {
        in.getline(buff,255);
        if(i==num) break;
        out<<buff<<endl;
        i++;
    }
    while(!in.eof()) {
        in.getline(buff,255);
        out<<buff<<endl;
    }
    out.close();
    in.close();
    remove("test.dat");
    rename("test.new","test.dat");
    return 0;
}

Алгоритм по совпадению строк отличается парой-тройкой строк
4.7K
30 октября 2007 года
bobik02
140 / / 11.09.2007
max_dark спасибо за код...

я наверлно не правильно обяснил, по номеру строки не подходит...
лучше уж по совпадению строки:)))
320
30 октября 2007 года
m_Valery
1.0K / / 08.01.2007
Код:
#include <iostream>
#include <fstream>
#include <string>
#include <vector>
#include <algorithm>
using namespace std;

int _tmain(int argc, _TCHAR* argv[])
{
    ifstream tester("test.dat");
    if(!tester)
    {
         cerr<<"Unable to open test.dat for reading"<<endl;
    }
    string name;
    vector<string> coll;
    while(getline(tester,name,'\n')){
        coll.push_back(name);
    }
    for(int i = 0;i < coll.size();++i)
        cout<<coll<< '\n';
    vector<string>::iterator pos;
    cout<<"Input string"<<endl;
    string str;
    cin>>str;
    pos = find(coll.begin(),coll.end(),str);
    if(pos != coll.end())
        coll.erase(pos);
    cout<<endl;
    for(int i = 0;i < coll.size();++i)
        cout<<coll<< '\n';
    cout<<endl;
    ofstream tester1("test.dat");
    if(!tester1)
    {
        cerr<<"Unable to open test.dat for writing"<<endl;
    }
    for(int i = 0;i < coll.size();++i)
        tester1 << coll << endl;
    return 0;
}
4.7K
30 октября 2007 года
bobik02
140 / / 11.09.2007
m_Valery Спасибо :)

с кодом разобрался, только не смог асилить что значит это:
 
Код:
int _tmain(int argc, _TCHAR* argv[])

почему в вместо main() стоит _tmain и что за фишки: (int argc, _TCHAR* argv[])
320
30 октября 2007 года
m_Valery
1.0K / / 08.01.2007
Можешь вместо int _tmain(int argc, _TCHAR* argv[]) использовать
int main().int argc и _TCHAR* argv[]) - параметры командной строки. argc - количество параметров,argv - строки,представляющие отдельные значения...Смотри об этом подробнее в учебниках.В Visual Studio 2003,2005 используется int _tmain,в 6-й была просто main.
4.7K
30 октября 2007 года
bobik02
140 / / 11.09.2007
кстати а как вам такой вариант:

что на самом деле с файла ничего удалятся не будет
а только будут высавлястся статусы...

например test.dat:
 
Код:
Tuzik <отступ> T
Shurik <отступ> T
Bobik <отступ> F
Sharik <отступ> T
Ivanov <отступ> F


там где F то значит что они "мертвые".
а там где T то значит что они "живые".

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

как такая идея, что скажите ?
-
это я делаю примочки к этому заданию:
http://forum.codenet.ru/showthread.php?t=42495
1.9K
30 октября 2007 года
max_dark
256 / / 11.11.2005
С такой структурой можно будет "воскрешать мертвецов" ;)
Если кого прибил по ошибке...
14K
31 октября 2007 года
stimpi
100 / / 04.09.2007
Цитата: bobik02
кстати а как вам такой вариант:

что на самом деле с файла ничего удалятся не будет
а только будут высавлястся статусы...

например test.dat:
 
Код:
Tuzik <отступ> T
Shurik <отступ> T
Bobik <отступ> F
Sharik <отступ> T
Ivanov <отступ> F
там где F то значит что они "мертвые".
а там где T то значит что они "живые".

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

как такая идея, что скажите ?



Код:
#include <iostream>
#include <fstream>
#include <iomanip>
using namespace std;

main()
{
    ofstream out("dogs.dat",ios::app);

    if(!out)
    {
        cerr << "Error open file";
        exit(1);
    }

    char *name = new char[15];
    char status;
   
    cout << "Enter dogs name and status:" << endl;
    while(cin >> name >> status) // ввести EOF (Ctrl+Z) для выхода
    {
        out << name << " " << status << endl;
    }
    out.close();
   
   
    ifstream in("dogs.dat",ios::in);
   
    if(!in)
    {
        cerr << "Error open file";
        exit(1);
    }

    cout << setiosflags(ios::left) << setw(10) << "Name"
        << setw(5) << "Status" << endl;

    while(in >> name >> status) // статус в переменной status
    {
        cout << setiosflags(ios::left) << setw(10) << name
            << setw(5) << status << endl;    
    }
    in.close();
    delete[] name;
}


в этом примере ты записываешь имя и статус, и читаешь имя и статус в отдельные переменные, и потом в цикле можешь сравнивать статус и вызывать функцию обработку с собаками
10K
01 ноября 2007 года
Omega Red
49 / / 15.10.2006
Можно функции read и write использовать, они записывают в файл структуры в текстовом виде, и соответственно могут удалять структуры
34K
06 декабря 2007 года
nokio49
2 / / 06.12.2007
Помогите написать похожую прогу плз...
Программа должна удалять запись по совподению строк, но тока в файле в котором нужно удалить данные не один столбец, а 5.
Программа которая приведена в этой теме работает только если в файле один столбец.
320
07 декабря 2007 года
m_Valery
1.0K / / 08.01.2007
Цитата: nokio49
Помогите написать похожую прогу плз...
Программа должна удалять запись по совподению строк, но тока в файле в котором нужно удалить данные не один столбец, а 5.
Программа которая приведена в этой теме работает только если в файле один столбец.


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

Код:
#include <iostream>
#include <fstream>
#include <string>
#include <vector>
#include <algorithm>
using namespace std;
int _tmain(int argc, _TCHAR* argv[])
{
    ifstream tester("test.txt");
    if(!tester)
    {
         cerr<<"Unable to open test.dat for reading"<<endl;
    }
    string name;
    vector<string> coll1;
    while(getline(tester,name,'\n')){
        coll1.push_back(name);
    }      
    copy(coll1.begin(),coll1.end(),
        ostream_iterator<string>(cout,"\n"));
    cout<<"Input word"<<endl;
    string str;
    cin>>str;
    for(size_t i = 0;i < coll1.size();++i){
        if(coll1.find(str) != -1)
          coll1.erase(coll1.find(str),str.size() + 1);
    }
    ofstream tester1("test.txt");
    if(!tester1)
    {
        cerr<<"Unable to open test.dat for writing"<<endl;
    }
    for(size_t i = 0;i < coll1.size();++i)
        tester1 << coll1 << endl;
   
    return 0;
}
34K
07 декабря 2007 года
nokio49
2 / / 06.12.2007
Спасибо за помощь, но это немного не то что мне нужно. Эта программа за раз удалет только одно слово, а мне нужно 5(Чтобы сразу всю строку удалить).
Приведу пример.
Дан файл следующего содержания:
 
Код:
max e1 2 3
ket e2 4 5 6
fed pr 7 8 9
jon e3 10 11 12
lon pk 13 14 15


Я ввожу с клавиатуры max e1 2 3, программа должна удалить первую строку. Т. е. должно остаться слежующее:
 
Код:
ket e2 4 5 6
fed pr 7 8 9
jon e3 10 11 12
lon pk 13 14 15

Помогите написать такую прогу плз...
320
07 декабря 2007 года
m_Valery
1.0K / / 08.01.2007
Векторы не поддерживают операции прямого удаления элементов, поэтому для этого применяют алгоритм.
Код:
#include <iostream>
#include <fstream>
#include <string>
#include <vector>
#include <algorithm>
using namespace std;
int _tmain(int argc, _TCHAR* argv[])
{
    ifstream tester("test.txt");
    if(!tester)
    {
         cerr<<"Unable to open test.dat for reading"<<endl;
    }
    string name;
    vector<string> coll1;
    while(getline(tester,name,'\n')){
        coll1.push_back(name);
    }      
    copy(coll1.begin(),coll1.end(),
        ostream_iterator<string>(cout,"\n"));
    cout<<"Input string"<<endl;
    string str;
    getline(cin,str,'\n');
    coll1.erase(remove(coll1.begin(),coll1.end(),str),coll1.end());
    ofstream tester1("test.txt");
    if(!tester1)
    {
        cerr<<"Unable to open test.dat for writing"<<endl;
    }
    for(size_t i = 0;i < coll1.size();++i)
        tester1 << coll1 << endl;
   
    return 0;
}
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог