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

удаление из файла строки, используя временный файл - C++

Восстановить пароль Регистрация
Другие темы раздела
C++ Массивы http://www.cyberforum.ru/cpp-beginners/thread513464.html
Введите числовую прямоугольную матрицу и найдите номер линии, в которой находится максимальный элемент!
C++ Определить длину массива Собственно терроризировал вчера весь гугль, ничего кроме такого метода нахождения длины не нашел sizeof(massiv)/sizeof(massiv_typ) но данная конструкция как-то коряво работает, если массив передавать в функцию, и в гугле нашел, что так работать не будет с массивами которые передаются как параметры функциям кто знаком с паскалем, там есть функция узнать длину массива обычных стандартных типов... http://www.cyberforum.ru/cpp-beginners/thread513446.html
C++ Заменить символы в строке.
Задача: Прочитать из файла строку символов. В данной строке каждый символ ? удвоить. Каждый символ, стоящий перед !, заменить символом, введенным с клавиатуры. Новую строку не создавать. Вывести исходную и преобразованную строки. Идея: Добавить символы из строки в массив. Работая с массивом сделать замену символов. Вопрос: Каким образом можно добавить символы строки из файла в массив? И...
Матрица змейкой C++
Пытаюсь написать решение для задачи, чтобы выводила матрицу в таком виде
C++ error C4716: Distance::getdist: должна возвращать значение http://www.cyberforum.ru/cpp-beginners/thread513422.html
уменя visual c++ 2010 professional.как решить проблему ? #include <iostream> using namespace std; /// class Distance { private: int feet; float inches; public:
C++ Начало изучения С++. Посоветуйте среду разработки. Здравствуйте, решил изучить C++, посоветуйте достойную среду разработки для этого языка, в скачанных (Visual c++, dev-c++) даже не получается запустить программу. Интерфейс среды должен быть русифицирован. До этого изучал Паскаль, есть что-нибудь такое же понятное без наворотов в меню для первых шагов? подробнее

Показать сообщение отдельно
muskos
6 / 6 / 0
Регистрация: 06.03.2012
Сообщений: 82
06.03.2012, 18:41     удаление из файла строки, используя временный файл
Помогите разобраться. Прилагаю исходник только функций, т.к. проблема в них по ходу.
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
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
#include <iostream>
#include <fstream>
#include "in.h"
using namespace std;
Del :: Del(char *s)
{
     len = strlen(s); 
     str = new char[len+1]; 
     strcpy(str, s);
}
ofstream& operator << (ofstream& out, Del& ob)
{
          out << ob.str << endl;
          return out;
}
ifstream& operator >> (ifstream& in, Del& ob)
{
        in >> ob.str;
        return in;  
}
void Del :: ReadData()
{
     char stroka[80];
     fstream in1;
     in1.open("test.data", ios :: in);
     do 
     {
           in1 >> stroka;
           cout << stroka << endl;
     }while (!in1.eof());
     in1.close();
}
void Del :: WriteData()
{
     char stroka[80];
     fstream out1;
     out1.open("test.data", ios::out | ios::app);
     cout << "Input char" << endl;
     cin >> stroka;
     out1 << endl << stroka ;
     out1.close();
}
void Del :: DeleteData() 
{
     char stroka[180];
     Del obj(stroka);
     int deleteline; // ГЁГ*äåêñ ГіГ¤Г*ëÿåìîé ñòðîêè
     cout << "Number of line" << endl;
     cin >> deleteline;
     fstream in1; 
     in1.open("test.data", ios :: in); // îòêðûâГ*ГҐГ¬ ГґГ*éë äëÿ Г·ГІГҐГ*ГЁГї ГЁГ§ ГґГ*éëГ*
     fstream in2;
     in2.open("test1", ios :: out); // îòêðûâГ*ГҐГ¬ ГґГ*éë äëÿ Г§Г*ГЇГЁГ±ГЁ Гў ГґГ*éë
     int n = 1;
     while(!in1.eof()) // ïðîãîГ*ГїГҐГ¬ ïåðâûé ГґГ*éë ïåðåçГ*ïèñûâГ*Гї ГўГ±Вё ГўГ® âòîðîé ГґГ*éë ГіГ¤Г*ëÿÿ ñòðîêó
     {
                      in1 >> obj.str;
                      if (n != deleteline)
                      {
                         in2 << obj.str << endl ;
                      }
                      n++;
     }    // áëîê Г°Г*áîòГ*ГҐГІ ГўГ±Вё ïåðåïèñûâГ*ГҐГІГ±Гї ГўГ® âðåìåГ*Г*ûé ГґГ*éë
     in1.close();
     in1.open("test.data", ios :: out); // îòêðûâГ*ГҐГ¬ ГґГ*éë äëÿ Г§Г*ГЇГЁГ±ГЁ
     in1.seekp(0);                      
     in2.close();
     in2.open("test1", ios :: in); // îòêðûâГ*ГҐГ¬ ГґГ*éë äëÿ Г·ГІГҐГ*ГЁГї
     while(!in2.eof()) 
     {
                      in2 >> obj.str;
                      cout << obj.str;
                      in1 << obj.str; // Г*ГҐ Г§Г*ïèñûâГ*ГҐГІ Гў ГґГ*éë
     }
     in1.close();
     in2.close();
}
Интересует последняя функция DeleteData. Пошагово открываем исходный файл, открываем временный файл, записываем строку(из исходного) в объект, записываем строку из объекта во временный файл. Здесь всё работает. Теперь второй этап. Сново всё открываем, только исходный для записи, а временный для чтения. Считываение из временно происходит, но в исходный файл ничего не пишется, т.е. при in1.open("test.data", ios :: out); файл просто оказывается пустым. Пробовал разные комбинации открытия файла для записи, ничего не помогает....
И второй вопрос, подскажите, как удалить потом временный файл...

Добавлено через 1 час 13 минут
Слава поиску!
Удаление данных из файла
осталось разобраться с пустыми символами добавленными в конец файла

Добавлено через 6 минут
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 Del :: DeleteData() 
{
     char stroka[180];
     Del obj(stroka);
     int deleteline; // индекс удаляемой строки
     cout << "Number of line" << endl;
     cin >> deleteline;
     fstream in1; 
     in1.open("test.data", ios :: in); // открываем файл для чтения из файла
     fstream in2;
     in2.open("test.data.tmp", ios :: out); // открываем файл для записи в файл
     int n = 1;
     while(!in1.eof()) // прогоняем первый файл перезаписывая всё во второй файл удаляя строку
     {
                      in1 >> obj.str;
                      if (n != deleteline)
                      {
                         in2 << obj.str ;
                         if (!in1.eof()) {in2 << endl;} // если не конец файла, тогда ставим переход на новую строку
                      }
                      n++;
     }    // блок работает всё переписывается во временный файл
     in1.close();
     in1.open("test.data", ios :: out); // открываем файл для записи                     
     in2.close();
     in2.open("test.data.tmp", ios :: in); // открываем файл для чтения
     in1.close();
     in2.close();
     remove("test.data");// удаляем исходный 
     rename("test.data.tmp","test.data"); // переименовываем временный
 
}
на всякий случай скидываю исходник решения вопроса
(метки: удаление строки из файла с помощью временного файла)
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
 
Текущее время: 14:45. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru