#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;
}
Удаления из файла данных (C++)
Код:
допустим ввел я несколько раз, и получился такой файл:
test.dat :
Код:
Tuzik
Shurik
Bobik
Sharik
Ivanov
Shurik
Bobik
Sharik
Ivanov
например я хочу удалить от туда запись Bobik или любую другую ...
как можно сделать ? может сущетвует кой алгоритм удаления или надо мудрувать ?
Так что давай конкретнее
Цитата: max_dark
Алгоритм зависит от того, по каким критериям ты будешь удалять запись: по номеру или по совпадению строк
Так что давай конкретнее
Так что давай конкретнее
впринцыпе все равно:p и вариант с удалением по сурагатному ключу или по совпаденю строк подходит
Код:
#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;
}
#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;
}
Алгоритм по совпадению строк отличается парой-тройкой строк
я наверлно не правильно обяснил, по номеру строки не подходит...
лучше уж по совпадению строки:)))
Код:
#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;
}
#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;
}
с кодом разобрался, только не смог асилить что значит это:
Код:
int _tmain(int argc, _TCHAR* argv[])
почему в вместо main() стоит _tmain и что за фишки: (int argc, _TCHAR* argv[])
int main().int argc и _TCHAR* argv[]) - параметры командной строки. argc - количество параметров,argv - строки,представляющие отдельные значения...Смотри об этом подробнее в учебниках.В Visual Studio 2003,2005 используется int _tmain,в 6-й была просто main.
что на самом деле с файла ничего удалятся не будет
а только будут высавлястся статусы...
например test.dat:
Код:
Tuzik <отступ> T
Shurik <отступ> T
Bobik <отступ> F
Sharik <отступ> T
Ivanov <отступ> F
Shurik <отступ> T
Bobik <отступ> F
Sharik <отступ> T
Ivanov <отступ> F
там где F то значит что они "мертвые".
а там где T то значит что они "живые".
а в самой проге будет функция которая проверяет статусы и работает только с "живыми" пользователями ... и функция по удалению, которая по сути статусы меняет на F
как такая идея, что скажите ?
-
это я делаю примочки к этому заданию:
http://forum.codenet.ru/showthread.php?t=42495
Если кого прибил по ошибке...
Цитата: bobik02
кстати а как вам такой вариант:
что на самом деле с файла ничего удалятся не будет
а только будут высавлястся статусы...
например test.dat:
там где F то значит что они "мертвые".
а там где T то значит что они "живые".
а в самой проге будет функция которая проверяет статусы и работает только с "живыми" пользователями ... и функция по удалению, которая по сути статусы меняет на F
как такая идея, что скажите ?
что на самом деле с файла ничего удалятся не будет
а только будут высавлястся статусы...
например test.dat:
Код:
Tuzik <отступ> T
Shurik <отступ> T
Bobik <отступ> F
Sharik <отступ> T
Ivanov <отступ> F
Shurik <отступ> T
Bobik <отступ> F
Sharik <отступ> T
Ivanov <отступ> 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;
}
#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;
}
в этом примере ты записываешь имя и статус, и читаешь имя и статус в отдельные переменные, и потом в цикле можешь сравнивать статус и вызывать функцию обработку с собаками
Можно функции read и write использовать, они записывают в файл структуры в текстовом виде, и соответственно могут удалять структуры
Программа должна удалять запись по совподению строк, но тока в файле в котором нужно удалить данные не один столбец, а 5.
Программа которая приведена в этой теме работает только если в файле один столбец.
Цитата: nokio49
Помогите написать похожую прогу плз...
Программа должна удалять запись по совподению строк, но тока в файле в котором нужно удалить данные не один столбец, а 5.
Программа которая приведена в этой теме работает только если в файле один столбец.
Программа должна удалять запись по совподению строк, но тока в файле в котором нужно удалить данные не один столбец, а 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;
}
#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;
}
Приведу пример.
Дан файл следующего содержания:
Код:
max e1 2 3
ket e2 4 5 6
fed pr 7 8 9
jon e3 10 11 12
lon pk 13 14 15
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
fed pr 7 8 9
jon e3 10 11 12
lon pk 13 14 15
Помогите написать такую прогу плз...
Код:
#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;
}
#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;
}