Форум программистов, компьютерный форум, киберфорум
C++ Builder
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.56/9: Рейтинг темы: голосов - 9, средняя оценка - 4.56
1 / 1 / 0
Регистрация: 04.12.2015
Сообщений: 37
1

Добавление строк в файл без дублирования уже существующих

07.02.2016, 05:25. Показов 1689. Ответов 14
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Доброго времен суток!
в общем у меня небольшая проблемка - не могу записать в файл нудным образом.
Смысл в следующем:
при нажатии на кнопку, в файл должна добавляться одна строка с переменными, при этом всё остальное в файле дожлно оставаться. Никак не могу реализовать(((
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
07.02.2016, 05:25
Ответы с готовыми решениями:

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

Реализовать добавление строк в уже открытый файл
помогите пожалуйста. есть программа, которая открывает и пересохраняет файл txt. нужно сделать,...

Добавление строк из батника в уже открытый файл
Здравствуйте уважаемые! Как можно из батника добавлять строки(значения переменных) в уже открытый...

Запрет добавления в TreeView уже существующих там строк
Строка из поля edit помещается в treeview по нажатии на кнопку. как сделать так, чтобы, если такая...

14
Модератор
9260 / 6038 / 2379
Регистрация: 21.01.2014
Сообщений: 25,802
Записей в блоге: 3
07.02.2016, 07:30 2
C++
1
2
3
4
5
6
7
8
9
10
11
//---------------------------------------------------------------------------
void __fastcall TForm1::Button1Click(TObject *Sender)
{
  TStringList *MyFile = new TStringList; // Создаем стринглист
  MyFile->LoadFromFile("c:\\tmp\\test.txt"); //грузим твой файл с какими-то данными
  String s = "твоя строка с переменными"; //Формируем строку для записи в файл
  MyFile->Add(s); //Добавляем строку в стринглист
  MyFile->SaveToFile("c:\\tmp\\test.txt"); //сохраняем стринглист в тот же самый файл
  delete MyFile; //Удаляем стринглист
}
//---------------------------------------------------------------------------
1
Супер-модератор
Эксперт Pascal/DelphiАвтор FAQ
32835 / 21172 / 8148
Регистрация: 22.10.2011
Сообщений: 36,431
Записей в блоге: 8
07.02.2016, 12:03 3
nsergeyev, версия Билдера?
0
1 / 1 / 0
Регистрация: 04.12.2015
Сообщений: 37
07.02.2016, 12:30  [ТС] 4
Embercadero 10+ Seattle.
Проблема с кодом выше.
сейчас у меня записан вот этот код:
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
void __fastcall TForm2::Button3Click(TObject *Sender)
{
         AnsiString file = "unbbridge.ns";
         AnsiString temp = Form1->EFLname->Text+ "\n" + Form1->EGroup->Text;
         TStringList *save = new TStringList;  // 1й TStringLis
         // записываемая строка
        save->Add(temp);
        if (FileExists(file) == false) // проверяем наличие файла
        {
            save->SaveToFile(file); // файл не найден, значит сохраняем как есть
        }
        else
        {   // если файл уже существует
            TStringList *hsave = new TStringList; // 2й TStringLis для существующего файла
            hsave->LoadFromFile(file); // загружаем существующий файл
            hsave->Add("***************************************"); // вроде как разделить добавляем
            hsave->Add("Rb="+(AnsiString)Upit+"\n"+"Rt="+(AnsiString)Rt);
            hsave->Text =save->Text+hsave->Text;  // к загруженному файлу добавляем новые записи
            hsave->SaveToFile(file); // сохраняем
            delete hsave; // чистим за собой
        }
        delete save; // чистим за собой
 
    }
Вот, но запись осуществляется следующим образом
///////////////////
Иванов
Кн-10-506
Иванов
Кн-10-506
Иванов
Кн-10-506
Иванов
Кн-10-506
Иванов
Кн-10-506
***************************************
Rb=0,25
Rt=69,555
***************************************
Rb=0,25
Rt=88,526
***************************************
Rb=0,25
Rt=106,915
***************************************
Rb=0,2
Rt=106,915
***************************************
Rb=0,3
Rt=106,915
//////////////////////
каждый раз заново записывается фамилия и группа в начало файла.Мне нужно, чтобы эта запись осуществлялась один раз
0
Супер-модератор
Эксперт Pascal/DelphiАвтор FAQ
32835 / 21172 / 8148
Регистрация: 22.10.2011
Сообщений: 36,431
Записей в блоге: 8
07.02.2016, 12:57 5
Цитата Сообщение от nsergeyev Посмотреть сообщение
Embercadero 10+ Seattle.
делает нужное тебе действие в две строки:
C++
1
2
3
4
5
6
7
#include <System.IOUtils.hpp>
 
void __fastcall TForm2::Button3Click(TObject *Sender)
{
    AnsiString file = ExtractFilePath(ParamStr(0)) + "unbbridge.ns";
    TFile::AppendAllText(file, Form1->EFLname->Text + "\n" + Form1->EGroup->Text + "\n***************************************\n");
}
0
1 / 1 / 0
Регистрация: 04.12.2015
Сообщений: 37
07.02.2016, 13:15  [ТС] 6
а как вот эти дозапишутся при таком случае?
C++
1
hsave->Add("Rb="+(AnsiString)Upit+"\n"+"Rt="+(AnsiString)Rt);
мне нужно, чтобы на выходе файл был примерно таким:

Иванов
Кн-10-506
***************************************
Rb=0,25
Rt=69,555
***************************************
Rb=0,25
Rt=88,526
***************************************
Rb=0,25
Rt=106,915
***************************************
Rb=0,2
Rt=106,915
***************************************
Rb=0,3
Rt=106,915
0
Супер-модератор
Эксперт Pascal/DelphiАвтор FAQ
32835 / 21172 / 8148
Регистрация: 22.10.2011
Сообщений: 36,431
Записей в блоге: 8
07.02.2016, 13:17 7
Лучший ответ Сообщение было отмечено BRcr как решение

Решение

Я написал, как нужно сделать, чтобы файл был именно таким (ну, за исключением того, что у меня еще один разделитель будет в самом низу)

Вот так будет все, как в посте выше:
C++
1
2
3
4
5
6
7
8
void __fastcall TForm2::Button3Click(TObject *Sender)
{
    String file = ExtractFilePath(ParamStr(0)) + "unbbridge.ns";
    if(!FileExists(file))
        TFile::AppendAllText(file, String().sprintf(L"%s\n%s\n", Form1->EFLname->Text, Form1->EGroup->Text));
    else
        TFile::AppendAllText(file, String().sprintf(L"***************************************\nRb=%f\nRt=%f\n", Upit, Rt));
}
1
1 / 1 / 0
Регистрация: 04.12.2015
Сообщений: 37
07.02.2016, 13:46  [ТС] 8
сейчас он записывает вот так:
"
***************************************
Rb=0.250000
Rt=123.000000
***************************************
Rb=0.250000
Rt=123.000000
***************************************
Rb=0.250000
Rt=106.915000
"
0
Супер-модератор
Эксперт Pascal/DelphiАвтор FAQ
32835 / 21172 / 8148
Регистрация: 22.10.2011
Сообщений: 36,431
Записей в блоге: 8
07.02.2016, 14:27 9
Ну, значит, замени 7-ю строку на:
C++
7
TFile::AppendAllText(file, String().sprintf(L"***************************************\nRb=%s\nRt=%s\n", (String)Upit, (String)Rt));
0
1 / 1 / 0
Регистрация: 04.12.2015
Сообщений: 37
07.02.2016, 14:35  [ТС] 10
Я о том, что сейчас не выводится информация о фамилии и группе
0
Супер-модератор
Эксперт Pascal/DelphiАвтор FAQ
32835 / 21172 / 8148
Регистрация: 22.10.2011
Сообщений: 36,431
Записей в блоге: 8
07.02.2016, 15:04 11
Неправда. Строки №4 и 5 этим как раз и занимаются. Если файла еще нет - то он создается и в него заносится информация о фамилии и группе. Я непроверенные коды не выкладываю...
1
1 / 1 / 0
Регистрация: 04.12.2015
Сообщений: 37
07.02.2016, 15:16  [ТС] 12
такие дела, не знаю, с чем это связано, но пишется именно так((((
Миниатюры
Добавление строк в файл без дублирования уже существующих   Добавление строк в файл без дублирования уже существующих   Добавление строк в файл без дублирования уже существующих  

Добавление строк в файл без дублирования уже существующих   Добавление строк в файл без дублирования уже существующих  
0
4043 / 2332 / 292
Регистрация: 03.02.2011
Сообщений: 5,066
Записей в блоге: 10
09.02.2016, 22:04 13
Лучший ответ Сообщение было отмечено nsergeyev как решение

Решение

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
void __fastcall TForm2::Button3Click(TObject *Sender)
{
        AnsiString file = "unbbridge.ns";
 
        if (FileExists(file) == false) // проверяем наличие файла
        {       
            AnsiString temp = Form1->EFLname->Text+ "\n" + Form1->EGroup->Text;
             TStringList *save = new TStringList;  // 1й TStringLis
             // записываемая строка
            save->Add(temp);
            save->SaveToFile(file); // файл не найден, значит сохраняем как есть
            delete save; // чистим за собой
        }
        // если файл уже существует
        TStringList *hsave = new TStringList; // 2й TStringLis для существующего файла
        hsave->LoadFromFile(file); // загружаем существующий файл
        hsave->Add("***************************************"); // вроде как разделить добавляем
        hsave->Add("Rb="+(AnsiString)Upit+"\n"+"Rt="+(AnsiString)Rt);
        hsave->SaveToFile(file); // сохраняем
        delete hsave; // чистим за собой     
}
1
1 / 1 / 0
Регистрация: 04.12.2015
Сообщений: 37
09.02.2016, 22:46  [ТС] 14
ещё такой вопрос, как сделать очистку файла при его открытии!?
понятно,что
C++
1
save->Clear();
но, какой строкой это осуществить?
заранее спасибо!)
0
4043 / 2332 / 292
Регистрация: 03.02.2011
Сообщений: 5,066
Записей в блоге: 10
09.02.2016, 23:41 15
Посмотрел, существует ли файл с таким именем. Если да - то просто удалил его совсем - это придерживаясь логики твоего же кода.
1
09.02.2016, 23:41
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
09.02.2016, 23:41
Помогаю со студенческими работами здесь

Почему INSERT INTO удаляет значения из уже существующих строк?
Делаю запрос TRUNCATE `table1`; INSERT INTO `table1` (`id`,`date`) SELECT `id`, `date` FROM...

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

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

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


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

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