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


Автор: Vex 22.5.2004, 23:05
Как удалить одну запись из файла:
вот например:

Код

...
struct txxx{
int x;
char y[10];
float z;
};

txxx my_xxx;
ofstream inxxx("file_name",ios::out);
...
outxxx.write((char*)&my_xxx,sizeof(my_xxx));
outxxx.close;



ну записали мы туда несколько структур, теперь читаем:

Код

ifstream inxxx("file_name",ios::in);
...
while(inxxx.eof()){
inxxx.read((char*)&my_xxx,sizeof(my_xxx));
...
}
inxxx.close;


Как мне удалить, например, пятую запись? Есть ли там вообще какие-то методы типа insert или delete?

P.S. ну и гадость же этот с++ даже нет типизированых файлов, зато куча классов в которых и черт голову сломит, полная анархия hmmm.gif

Автор: Guest 22.5.2004, 23:43
Я не очень понял, про что вопрос, но постараюсь ответить.
1. создай массив структур, считывай все в массив, а потом пропускай ненужные элементы при записи или добавляй их.
2. можешь вместо файлов использовать СУБД.
3. можешь сам определить функции или методы методы типа insert или delete для своих структур и использовать их.



Автор: Vex 23.5.2004, 00:08
Цитата
1. создай массив структур, считывай все в массив, а потом пропускай ненужные элементы при записи или добавляй их.


Не хочу заморачиваться с динамическими массивами, а С++ наверняка не поддерживает открытых массивов.


Цитата
2. можешь вместо файлов использовать СУБД.

Исключено.


Цитата
3. можешь сам определить функции или методы методы типа insert или delete для своих структур и использовать их.


Наверное так и придется делать.

З.Ы. Блин, сколько классов для одной простой цели (ввод-вывод в файл) а нет самых элементарных вещей mad.gif

Автор: Anklav 23.5.2004, 02:32
Цитата
а С++ наверняка не поддерживает открытых массивов.

Ну, написать класс такого динамического массива - это не проблема, на то он и C++.

Автор: Baa 23.5.2004, 02:38
а почему нельзя использовать STL? vector или list

Автор: Гость00 23.5.2004, 06:47
Цитата(Vex @ 22.5.2004, 23:05)
P.S. ну и гадость же этот с++ даже нет типизированых файлов, зато куча классов в которых и черт голову сломит, полная анархия hmmm.gif

Типизированный файл можно объявить, например, просто используя шаблоны basic_(if,of)stream
Например, обычный ofstream объявляется как

typedef basic_ofstream<char, char_traits<char>> ofstream;

Можно вместо char поставить другой тип

Автор: Sined 23.5.2004, 11:38
Привет! Вот прогрммка, которая удаляет из заданной позиции файла задданое количество байт--один глюк правда, размер при этом не меняется
Код
fstream Data("1.txt",ios::in |ios::out |ios::binary);
fstream Data_2("2.txt",ios::out|ios::binary);
char* some_data;
int get_size()
{
Data.seekg(0,ios::end);
return Data.tellg();
}

int fun_remove_from_pos(int pos,int bytes_to_remove)
{
some_data=NULL;
int i=get_size()-pos-bytes_to_remove;
some_data=(char*)malloc(i);
Data.seekp(pos+bytes_to_remove,ios::beg);
Data.read(some_data,i);
some_data[i-1]=EOF;
Data.seekp(pos,ios::beg);
Data.write(some_data,i);
free(some_data);
}

int main(int argc, char **argv)
{
fun_remove_from_pos(12,4);
Data.close();
       return 0;
}


Автор: Vex 23.5.2004, 11:47
Цитата
а почему нельзя использовать STL? vector или list


Не я выбираю, что мне использовать sad.gif

Sined, о, то что надо, спасибо wink.gif

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

Автор: Baa 23.5.2004, 12:32
Код

#include <fstream.h>


int _tmain(int argc, _TCHAR* argv[])
{

fstream Data("c:\\1.txt",ios::in |ios::out |ios::binary);
fstream Data_2("c:\\2.txt",ios::out|ios::binary);

int iCounter = 0;
while (!Data.eof())
{
 char cTemp;
 iCounter++;
 Data.read (&cTemp, 1);
//нам надо удалить пятый элемент
 if (iCounter == 5)
 {
 } else {
  Data_2.write (&cTemp, 1);
 }
}

Data.close ();
Data_2.close();
return 0;
}

Автор: Vex 24.5.2004, 23:08
Baa, сенькс ;)

Люди, подскажите аналог паскалевского Rewrite(); // запись файла с нуля




З.Ы. 2Baa что-то нам с инетом не везет, часто падает, и аська стала глючной sad.gif

Автор: Sined 24.5.2004, 23:11
Не мог бы ты поподробнее сказать...
Если просто отбросить содержимое файла
например так
fstream D2("file_name",ios::bin|ios::trunc);

Автор: Vex 24.5.2004, 23:57
ОК, понятно. мне надо, чтобы при добавлении записи в файл старые данные исчезли.

а не подскажите функцию удаления файла?


З.Ы. извините, что всех уже замучал, просто из С++ под рукой есть только книга "Visual C++ 6.0 Для профессионалов" adv/14.gif

З.Ы модеры извините меня, но вопросы столь мелочные, что даже новую тему открывать не стоит, но если скажете, я все удалю и создам соответствующие топики.

Автор: chipset 25.5.2004, 01:12
Vex
Visual C++ 6.0 для профессионалов Круглински, Шеферд, Уингоу? Да классная книжкаsmile.gif
Ах да функция удаления файла...
DeleteFile("file.txt");
Ещё exception'ами окружи, мало ли rolleyes.gif

Автор: sergejzr 25.5.2004, 03:08
Ну или на Анзи Си

Код
#include <stdio.h>

//Удаляем
int remove(const char *pathname);

//Переименовываем
int rename(const char *oldpath, const char *newpath);

Автор: Vex 31.5.2004, 14:05
Baa, нашел глюк в твоем коде, когда даные копируются, то во втором файле дублируется последняя запись, не подскажешь как исправить?

Добавлено @ 14:06
еще не удаляется последняя запись.

Автор: Baa 1.6.2004, 02:47
Так будет лучше... это беда в eof'е... кривой он sad.gif
Код

FILE* fp;
FILE* fp1;
fp = fopen ("c:\\1.txt", "r");
fp1 = fopen ("c:\\2.txt", "w");

int iCounter = 0;
char cTemp;
while (fread (&cTemp, 1, 1, fp))
{
 iCounter++;
//нам надо удалить пятый элемент
if (iCounter == 5)
{
} else {
 fwrite (&cTemp, 1, 1, fp1);
}
}

fclose (fp);
fclose (fp1);

ну или, если уж охото тот вариант, то так:
Код

fstream Data("c:\\1.txt",ios::in |ios::out |ios::binary);
fstream Data_2("c:\\2.txt",ios::out|ios::binary);

int iCounter = 0; char cTemp;
while (Data.read (&cTemp, 1) && Data.gcount() != 0)
{

iCounter++;

//нам надо удалить пятый элемент
if (iCounter == 1)
{
} else {
 Data_2.write (&cTemp, 1);
}
}

Data.close ();
Data_2.close();

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