Форум программистов, компьютерный форум CyberForum.ru
Наши страницы

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 55, средняя оценка - 4.73
groozzz
0 / 0 / 0
Регистрация: 12.05.2009
Сообщений: 26
#1

Удаление строки из файла\либо удаление самого файла. - C++

30.05.2009, 15:12. Просмотров 7166. Ответов 9
Метки нет (Все метки)

День добрый, вот функция(используемые переменные объявленны ранее):
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
void delete_cruise()
{
    FILE *fout;
open_file("abase.dat");
    char *result;   
    char line[255], find_str[255];
fin=fopen("abase.dat","rt");
    if(fin==NULL)
    cout<<"ЋиЁЎЄ*! “Є*§***л© д*©« *Ґ **©¤Ґ*."<<"\n";//Сообщение об ошибке, если файл не найден
    else
    {
        cout<<"‚ўҐ¤ЁвҐ *®¬Ґа ३б*:"<<char(9);//Введите номер рейса:
        input_part(&Num[0],10);
        while((result=fgets(line,255, fin))!=NULL)
        {
        int len=strlen(line);
                while(len>=0)
                {
                    find_str[len]=line[len];
                    len--;
                }
        strtok(find_str,"   ");
        if(!strstr(find_str, Num))
            {
                printf("%s\n",result);//на время, потом заменю на запись в файл
            }
        }
    fclose(fin);
    remove("abase.dat"); //не удаляет.
    }
 
}
Проблема в следующем. Несмотря на fclose - файл не удаляется.
Вообще задача состоит в удалении строки с найденным значением Num(в первом поле).
Пробовал через tmpfile() создать новый файл и вести запись строк не удовлетворяющих условию поиска в него, сообщений об ошибке нет, но при попытке чтения из этого "временного файла" не выводит никакой информации, какие-то 3-4 посторонних символа и всё.

З.Ы. Как показала практика - невозможно открыть файл для чтения и сразу писать в него? То есть я не могу найденную строку удалить из исходного файла, не прибегая к посторонним?
Собственно, перепробовав множество различных вариантов - остановился на создании нового фала, в который будет производится запись, а затем удалении оригинала и переименовании созданного.

Добавлено через 17 минут 15 секунд
Так, по поводу удаления разобрался, дело было в функции
C++
1
open_file("abase.dat");
которая конфликтовала с простым открытием. После этого файл закрылся. Теперь интересует только возможность работы именно с временным, а не промежуточным файлом(tmpfile()) или по возможности редактировании текущего
0
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
30.05.2009, 15:12
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Удаление строки из файла\либо удаление самого файла. (C++):

Удаление символа перевода строки из самого конца файла - C++
void SaveToFile() { ofstream out; out.open(&quot;Directory.txt&quot;); Directory.Print(size, PrintEl, out); long pos = out.tellp(); ...

Удаление из файла строки - C++
Есть файл (computers.dat) куда записываются данные (структура) о компьютерах (тип, год, цена). Задание: Пользователь вводит год...

Удаление строки из файла - C++
В общем у меня есть текстовый документ, в котором что-то записано таблицей. И мне надо удалить из неё какую-либо строку. Я решил читать...

Удаление строки файла - C++
Подскажите как удалить строку из файла? я знаю что можно перезаписывать файл, удалить из первого файла строку и записать в другой файл.

Удаление строки из файла - C++
Здравствуйте! Подскажите пожалуйста, как реализовать функцию удаления нужной строки из файла. Только не по номеру, а по содержимому! Я так...

Удаление строки из файла - C++
Кто может подсказать рабочую функцию удаление строки из файла. Поиск строки не нужен, только удаление :)

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Evg
Эксперт CАвтор FAQ
17815 / 6025 / 388
Регистрация: 30.03.2009
Сообщений: 16,554
Записей в блоге: 26
30.05.2009, 15:50 #2
> Собственно, перепробовав множество различных вариантов - остановился
> на создании нового фала, в который будет производится запись, а затем
> удалении оригинала и переименовании созданного.

Именно так и надо делать

> Теперь интересует только возможность работы именно с временным,
> а не промежуточным файлом

Чем в твоём понимании временный отличается от промежуточного?
0
groozzz
0 / 0 / 0
Регистрация: 12.05.2009
Сообщений: 26
30.05.2009, 15:58  [ТС] #3
Промежуточный мы создаем самостоятельно, указывая параметры и удаляя по завершении. А временный, как я понял из tmpfile() -по завершении удаляется сам, да и где он создается я так и не нашел.
0
Evg
Эксперт CАвтор FAQ
17815 / 6025 / 388
Регистрация: 30.03.2009
Сообщений: 16,554
Записей в блоге: 26
30.05.2009, 16:30 #4
А вопрос-то в чём состоит? Как его создать или чего?
0
groozzz
0 / 0 / 0
Регистрация: 12.05.2009
Сообщений: 26
30.05.2009, 16:45  [ТС] #5
Да, как вообще использовать tmpfile()?
маны читал, там указана только запись во временный файл, а, повторюсь, при попытке чтения из него у меня выдает 3-4 неизвестных символа и всё. То есть, заменив 14-27ю строки вышеприведенного кода на
C++
1
2
3
4
5
6
7
        while((result=fgets(tmpline,255, fin))!=NULL)
        {
        if(!strstr(result, Num))
            {
                fprintf(tmp,result);
            }
        }
и используя tmp не через
C++
1
tmp=fopen("~abase.tmp","at");
a
C++
1
tmp=tmpfile();
как потом из него считывать данные? Как из обычного файла не выходит
0
Evg
Эксперт CАвтор FAQ
17815 / 6025 / 388
Регистрация: 30.03.2009
Сообщений: 16,554
Записей в блоге: 26
30.05.2009, 18:30 #6
tmpfile тебе возвращает открытый на запись файл. Его имя, насколько я себе это представляю, недоступно. Чтобы что-то из него прочитать, нужно его сначала закрыть, а потом открыть на чтение, а поскольку имя тебе недоступно, то открыть ты его уже не сможешь.

Не заморачивайся этим и создай свой файл.
0
Delphin_KKC
UNIX-way
710 / 495 / 17
Регистрация: 15.01.2009
Сообщений: 1,721
02.06.2009, 11:56 #7
Цитата Сообщение от Evg Посмотреть сообщение
tmpfile тебе возвращает открытый на запись файл. Его имя, насколько я себе это представляю, недоступно. Чтобы что-то из него прочитать, нужно его сначала закрыть, а потом открыть на чтение, а поскольку имя тебе недоступно, то открыть ты его уже не сможешь....
И правда, после закрытия этот файл уже не прочитать. Потому что он удаляется. Но прочитать его очень даже можно. Ниже привожу текст программки, которая принимает от пользователя строку, записывает её в этот файл, а затем её оттуда читает. Для чистоты эксперимента перед чтением я обнуляю буфер, в который строка читается. Контроля границ нет, потому не вводжите строки длиннее 255 символов. Программа записывает только одну строку. Но при желании можно сделать цикл и писать хоть сто одну. Главное не забывать про нулевой байт в конце строки.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
#include <cstdlib>
#include <iostream>
#include <stdio.h>
 
using namespace std;
 
int main(int argc, char *argv[])
{
    char n[256];
    cout << "Input string: ";
    cin >> n;
    FILE *tmp = tmpfile();
    for (int i=0;n[i] != 0; i++)
    {
        putc(n[i],tmp);
    }
    fseek(tmp,0,SEEK_SET);//переход на нулевой байт от начала файла
    for (int i=0; i < 256; i++) 
    {
        n[i]=0;
    }
    cout << endl<<endl;
    int c;
    for (int i=0;(c=getc(tmp)) != EOF;i++)
    {
    n[i]=static_cast<char>(c);    
    }
    cout<<"n="<<n<<endl;
    system("PAUSE");
    return EXIT_SUCCESS;
}
З.Ы. Для компиляции использовал среду DevC++ 4.9.9.2
З.З.Ы. Для надёжности перед fseek можно вызвать fflush(tmp);
0
Миниатюры
Удаление строки из файла\либо удаление самого файла.  
Evg
Эксперт CАвтор FAQ
17815 / 6025 / 388
Регистрация: 30.03.2009
Сообщений: 16,554
Записей в блоге: 26
02.06.2009, 12:28 #8
А ты уверен, что на всех системах открытый на запись файл можно читать? Даже после fseek
0
Delphin_KKC
UNIX-way
710 / 495 / 17
Регистрация: 15.01.2009
Сообщений: 1,721
06.06.2009, 00:26 #9
Цитата Сообщение от Evg Посмотреть сообщение
А ты уверен, что на всех системах открытый на запись файл можно читать? Даже после fseek
А иначе какой смысл его создавать? Проверял, правда, только на ВинХР 32-бит. Компилятор DevC++ 4.9.9.2
0
Evg
Эксперт CАвтор FAQ
17815 / 6025 / 388
Регистрация: 30.03.2009
Сообщений: 16,554
Записей в блоге: 26
06.06.2009, 00:40 #10
Цитата Сообщение от Delphin_KKC Посмотреть сообщение
А иначе какой смысл его создавать?
ЛОгично
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
06.06.2009, 00:40
Привет! Вот еще темы с ответами:

Удаление строки из файла - C++
Добрый день, возник вопрос возможно ли удалить/изменить в файле слово/строку, не перезаписывая при этом весь файл?

Удаление строки из файла - C++
Сабж, осуществляю ввод и вывод с помощью iostream и использованием векторного массива, нужно удалить строку из файла... Интересует пример...

Удаление последней строки из файла - C++
Добрый день, форумчане. Назрел такой вопрос у меня: как удалить последнюю строчку в файле и переместить указатель на предыдущую? Заранее...

Запись/Удаление строки из файла - C++
Помогите с записью строки в файл, вообще если что задание написать &quot;Телефонный справочник&quot; в каждой строке которого должно быть две позиции...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
Yandex
Объявления
06.06.2009, 00:40
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru