Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.60/58: Рейтинг темы: голосов - 58, средняя оценка - 4.60
0 / 0 / 0
Регистрация: 12.05.2009
Сообщений: 26
1

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

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

Author24 — интернет-сервис помощи студентам
День добрый, вот функция(используемые переменные объявленны ранее):
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
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
30.05.2009, 15:12
Ответы с готовыми решениями:

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

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

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

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

9
Evg
Эксперт CАвтор FAQ
21279 / 8301 / 637
Регистрация: 30.03.2009
Сообщений: 22,659
Записей в блоге: 30
30.05.2009, 15:50 2
> Собственно, перепробовав множество различных вариантов - остановился
> на создании нового фала, в который будет производится запись, а затем
> удалении оригинала и переименовании созданного.

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

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

Чем в твоём понимании временный отличается от промежуточного?
0
0 / 0 / 0
Регистрация: 12.05.2009
Сообщений: 26
30.05.2009, 15:58  [ТС] 3
Промежуточный мы создаем самостоятельно, указывая параметры и удаляя по завершении. А временный, как я понял из tmpfile() -по завершении удаляется сам, да и где он создается я так и не нашел.
0
Evg
Эксперт CАвтор FAQ
21279 / 8301 / 637
Регистрация: 30.03.2009
Сообщений: 22,659
Записей в блоге: 30
30.05.2009, 16:30 4
А вопрос-то в чём состоит? Как его создать или чего?
0
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
21279 / 8301 / 637
Регистрация: 30.03.2009
Сообщений: 22,659
Записей в блоге: 30
30.05.2009, 18:30 6
tmpfile тебе возвращает открытый на запись файл. Его имя, насколько я себе это представляю, недоступно. Чтобы что-то из него прочитать, нужно его сначала закрыть, а потом открыть на чтение, а поскольку имя тебе недоступно, то открыть ты его уже не сможешь.

Не заморачивайся этим и создай свой файл.
0
UNIX-way
712 / 495 / 49
Регистрация: 15.01.2009
Сообщений: 1,720
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
21279 / 8301 / 637
Регистрация: 30.03.2009
Сообщений: 22,659
Записей в блоге: 30
02.06.2009, 12:28 8
А ты уверен, что на всех системах открытый на запись файл можно читать? Даже после fseek
0
UNIX-way
712 / 495 / 49
Регистрация: 15.01.2009
Сообщений: 1,720
06.06.2009, 00:26 9
Цитата Сообщение от Evg Посмотреть сообщение
А ты уверен, что на всех системах открытый на запись файл можно читать? Даже после fseek
А иначе какой смысл его создавать? Проверял, правда, только на ВинХР 32-бит. Компилятор DevC++ 4.9.9.2
0
Evg
Эксперт CАвтор FAQ
21279 / 8301 / 637
Регистрация: 30.03.2009
Сообщений: 22,659
Записей в блоге: 30
06.06.2009, 00:40 10
Цитата Сообщение от Delphin_KKC Посмотреть сообщение
А иначе какой смысл его создавать?
ЛОгично
0
06.06.2009, 00:40
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
06.06.2009, 00:40
Помогаю со студенческими работами здесь

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

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

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

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


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

Или воспользуйтесь поиском по форуму:
10
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru