zapis do pliku tekstowego - problem z dopisywaniem danych

dział ogólny

zapis do pliku tekstowego - problem z dopisywaniem danych

Nowy postprzez jabu74 - ekspert » czwartek, 14 sierpnia 2008, 18:53

witam !

nie wiem jak napisac kod, ktory dopisywalby kolejne dane do istniejacego juz pliku tekstowego z danymi, a jego stara zawartosc nie byla niszczona. jezeli plik nie istnieje to zeby go program sam wczesniej utworzyl.

napisalem cos takiego wykorzystujace WinAPI ale program nie dopisuje danych.

w Edit2 sciezka i nazwa pliku, w Str3 biezacy tekst do zapisania
Kod: Zaznacz cały
HANDLE aFile;
DWORD bytes_written;

aFile = CreateFile(Edit2->Text.c_str(), GENERIC_WRITE, 0, NULL, OPEN_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL);

if (aFile != INVALID_HANDLE_VALUE) {

        WriteFile(aFile, Str3.c_str(), Str3.Length(), &bytes_written, NULL);

        CloseHandle(aFile);
}


zaraz mnie cos trafi ale nie powiem co :evil:
Avatar użytkownika
jabu74 - ekspert
 
    NieznanyNieznana

Re: zapis do pliku tekstowego - problem z dopisywaniem danych

Nowy postprzez kinio » czwartek, 14 sierpnia 2008, 19:20

Cześć!!
A tak nie może być? Z wykorzystaniem zwyklej biblioteki stdio.h ?? Czy musi być API.

Kod: Zaznacz cały
String Str3 = "string";
FILE *file = fopen(Edit2->Text.c_str(), "a");
if(file != NULL)
{
    fprintf(file, "%s", Str3.c_str());
    fclose(file);
}

P.S. Tak jest najprościej!
Aha, oczywiście dodaj biblioteke:
Kod: Zaznacz cały
#include <stdio.h>
If a machine is expected to be infallible, it cannot also be intelligent.
-- A.Turing
Avatar użytkownika
kinio
Homos antropiczny
Homos antropiczny
 
Posty: 67
Dołączył(a): poniedziałek, 14 lipca 2008, 08:51
PodziÄ™kowaÅ‚ : 0
OtrzymaÅ‚ podziÄ™kowaÅ„: 0
    NieznanyNieznana

Re: zapis do pliku tekstowego - problem z dopisywaniem danych

Nowy postprzez Cyfrowy Baron » czwartek, 14 sierpnia 2008, 19:22

Użyj klasy FILE:

Kod: Zaznacz cały
  #include <stdio.h>

  FILE *stream = fopen("c:\\Plik.txt", "a+t");
  fprintf(stream, "%s", "Dopisywany tekst");
  fclose(stream);


dopisane później:
Jak widzę posty zbiegły się w czasie i myślałem podobnie jak kinio

Dodam jeszcze, że można ewentualnie tak zrobić, iż wczytujesz jakiś plik do obiektu klasy TStrings (TStringList) i dodajesz do niego nowe dane poprzez jego funkcję Add, a potem znów zapisujesz to do pliku, ale to już zależy czego potrzebujesz.
Avatar użytkownika
Cyfrowy Baron
Administrator
Administrator
 
Posty: 4716
Dołączył(a): niedziela, 13 lipca 2008, 15:17
PodziÄ™kowaÅ‚ : 12
OtrzymaÅ‚ podziÄ™kowaÅ„: 442
System operacyjny: Windows 7 x64 SP1
Kompilator: Embarcadero RAD Studio XE2
C++ Builder XE2 Update 4
SKYPE: cyfbar
Gadu Gadu: 0
    NieznanyNieznana

Re: zapis do pliku tekstowego - problem z dopisywaniem danych

Nowy postprzez kinio » czwartek, 14 sierpnia 2008, 19:33

Dodam jeszcze, że można ewentualnie tak zrobić, iż wczytujesz jakiś plik do obiektu klasy TStrings (TStringList) i dodajesz do niego nowe dane poprzez jego funkcję Add, a potem znów zapisujesz to do pliku, ale to już zależy czego potrzebujesz.

To faktycznie zależy czego potrzebujesz. Bo jeżeli tylko dopisania na koniec pliku to użyj mojego sposobu lub pierwszego sposobu zaprezentowanego przez CB. Ten drugi sposób ma słuszność tylko w momencie kiedy chcesz zrobić coś z zawartością pliku (wyświetlić, przeanalizować). W innym przypadku jest to nie efektywne, gdyż cały plik zostaje załadowany do pamięci RAM, natomiast w pierwszej metodzie ustalany jest tylko uchwyt do pliku i wskaźnik jest przesunięty na jego koniec, na podstawie danych z tablic alokacji więc zawartość pliku nie jest czytana wogóle. Różnicę w działaniu możesz zauważyć przy dużych plikach.
If a machine is expected to be infallible, it cannot also be intelligent.
-- A.Turing
Avatar użytkownika
kinio
Homos antropiczny
Homos antropiczny
 
Posty: 67
Dołączył(a): poniedziałek, 14 lipca 2008, 08:51
PodziÄ™kowaÅ‚ : 0
OtrzymaÅ‚ podziÄ™kowaÅ„: 0
    NieznanyNieznana

Re: zapis do pliku tekstowego - problem z dopisywaniem danych

Nowy postprzez jabu74 - ekspert » czwartek, 14 sierpnia 2008, 21:11

aaaaaa !

dobre ! hehe ! w ANSI C ! ale wlasnie caly pic polega zeby wykorzystac WinAPI bo zaglebiam sie w tajniki swindowsa !

ale OK dziekuje za przypomnienie pewno z tego skorzystam i nie bede sie meczyl z tym zafajdanym WinAPI

pozdro :lol:
Avatar użytkownika
jabu74 - ekspert
 
    NieznanyNieznana

Re: zapis do pliku tekstowego - problem z dopisywaniem danych

Nowy postprzez jabu74 - ekspert » czwartek, 14 sierpnia 2008, 21:32

zamiast Str3 chcialbym zapisywac do pliku tylko pierwsza linie z Memo1. jak zmienic kod ?

pozdrawiam
Avatar użytkownika
jabu74 - ekspert
 
    NieznanyNieznana

Re: zapis do pliku tekstowego - problem z dopisywaniem danych

Nowy postprzez kinio » piÄ…tek, 15 sierpnia 2008, 08:53

Cześć!
Pierwsza linia z Memo to:
Kod: Zaznacz cały
Memo1->Lines->Strings[0];
If a machine is expected to be infallible, it cannot also be intelligent.
-- A.Turing
Avatar użytkownika
kinio
Homos antropiczny
Homos antropiczny
 
Posty: 67
Dołączył(a): poniedziałek, 14 lipca 2008, 08:51
PodziÄ™kowaÅ‚ : 0
OtrzymaÅ‚ podziÄ™kowaÅ„: 0
    NieznanyNieznana

Re: zapis do pliku tekstowego - problem z dopisywaniem danych

Nowy postprzez Cyfrowy Baron » piÄ…tek, 15 sierpnia 2008, 09:44

Windows API (zwane też WinAPI) – interfejs programistyczny systemu Windows; zbiór funkcji, stałych i zmiennych potrzebnych i umożliwiających działanie programu w systemie operacyjnym Windows.


Tak wiec niezależnie od tego czy korzystasz z klasy FILE czy np. TStrings to korzystasz z tego interfejsu.

Klasa FILE ma tą przewagę nad klasą TStringList, że może dopisywać dane do pliku bez konieczności wczytywania pliku do pamięci, jest bardzo łatwa w użyciu mimo iż operuje na zmiennych typu CHAR, to można łatwo dokonać konwersji za pomocą funkcji c_str(). Klasa FILE idealnie nadaje się do tworzenia logów.

Dwa przykłady na Twoje potrzeby z wykorzystaniem klas FILE i TStringList:

FILE
Kod: Zaznacz cały
  #include <stdio.h>
 
  String fileName = "nazwa pliku.roz";

  FILE *stream = fopen(fileName.c_str(), "a+t"); // a tylko dopisuje, t tworzy jeżeli plik nie istnieje

  String value = Memo1->Items->Strings[0];// gdzie 0 to numer 1 linii, musi istnieć.
  fprintf(stream, "%s", value.c_str());

  fclose(stream);


TStringList
Kod: Zaznacz cały
  String fileName = "nazwa pliku.roz";

  TStrings *stream = new TStringList; // nie sugeruj siÄ™ nazwÄ… stream, to nie jest zapis sztrumieniowy
 
  if(FileExists(fileName))
    stream->LoadFromFile(fileName);

  String value = Memo1->Items->Strings[0];// gdzie 0 to numer 1 linii, musi istnieć.
  stream->Add(value);

  stream->SaveToFile(fileName);
  delete stream;


Nie wiem co tworzysz, ale jeżeli tworzysz np. logi, to można to wzbogacić o dodawanie np. daty:

Kod: Zaznacz cały
  String value = Memo1->Items->Strings[0];// gdzie 0 to numer 1 linii, musi istnieć.
  TDateTime now = TDateTime::CurrentDateTime();
  String data = now.FormatString("dd-mm-yyyy hh:nn:ss    ");
  fprintf(stream, "%s%s", now.c_str(), value.c_str());


Kod: Zaznacz cały
  String value = Memo1->Items->Strings[0];// gdzie 0 to numer 1 linii, musi istnieć.
  TDateTime now = TDateTime::CurrentDateTime();
  String data = now.FormatString("dd-mm-yyyy hh:nn:ss    ");
  stream->Add(now + value);

  stream->SaveToFile(fileName);
  delete stream;


Opis klasy TStringList w serwisie: Cyfrowy Baron w dziale: porady | TStringList.
Avatar użytkownika
Cyfrowy Baron
Administrator
Administrator
 
Posty: 4716
Dołączył(a): niedziela, 13 lipca 2008, 15:17
PodziÄ™kowaÅ‚ : 12
OtrzymaÅ‚ podziÄ™kowaÅ„: 442
System operacyjny: Windows 7 x64 SP1
Kompilator: Embarcadero RAD Studio XE2
C++ Builder XE2 Update 4
SKYPE: cyfbar
Gadu Gadu: 0
    NieznanyNieznana


  • Podobne tematy
    Odpowiedzi
    Wyświetlone
    Ostatni post

Powrót do Ogólne problemy z programowaniem

Kto przeglÄ…da forum

Użytkownicy przeglądający ten dział: Brak zalogowanych użytkowników i 42 gości

cron