Tworzenie pliku *.dat w podfolderze

0

Jak w temacie.

Nie chcę wpisywać całej ścieżki, gdzie będzie plik *.dat, bo nie oto chodzi. Planuję rozesłać programik innym osobom, więc gdzie one sobie go ulokują to ich, a głupio by było, by pliki z danymi zawsze trafiały w to samo miejsce, głupio też by było, by trafiały do folderu z programem. Najlepiej i najporządniej by było, gdyby trafiały do podfolderu, który znajduje się w folderze z programem.

Jest taka możliwość? Jak to zrealizować?

Dopiero uczę się obsługi plików w c++, proszę o pomoc.

0

Pobierasz katalog w którym jest program i dodajesz do tej zmiennej nazwę folderu który znajduje się wraz z programem.

0

@up Mysle, ze nie ma sensu za kazdym razem pobierac sciezki, bo i po co skoro pliki maja byc w podfoldzerze, wiec sciezka nie jest istotna.

Problem jest tylko w tym, ze maja byc zapisywane pliki o roznych nazwach wiec ja proponuje tak:

#define folder "folder/"
int main(int argc, char *argv[])
{
   char path[30];
   strcpy(path, folder);
   strcpy(path+strlen(folder), argv[1]);

   /* tworzysz desryptory i tak dalej sciezke juz masz, a gdzie zapisac nazwe pliku Ci podadza */
}

Oczywiscie jesli ma byc caly czas to ten sam plik to nie trzeba takich rzeczy, tylko wystarczy gdzies sciezke zapisac i zniej korzystac w funkcjach write open itd.

0

@t0m_k pliki będą miały nazwy nadawane przez datę systemową. Nie chciałbym robić tego tak, że będzie gdzieś pole na wpisanie aktualnej ścieżki, ale by to było automatiko, jak sugeruje @mi14chal (o ile dobrze to interpretuję).

Prosiłbym więc o rozwinięcie pomysłu: jak się pobiera taki katalog?

0

To robisz tak samo jak Ci pokazalem, z ta roznica ze nie pobierasz od uzytkownika nazwy, tylko dodajesz do nazwy folderu(nie sciezki) date i na koniec rozszerzenie ;)

0

@t0m_k nie umiem tego odpalić.

Dałoby się wykorzystać coś takiego:

DWORD nBufferLength;
LPTSTR lpBuffer;
GetCurrentDirectory(nBufferLength,lpBuffer);

???

Tyle znalazłem, ale jeszcze nie wiem, jak to zastosować.

0
 char path[30];
   strcpy(path, folder);
   strcpy(path+strlen(folder), argv[1]);

Zuo. 30 znakowa ścieżka? W trzeciej linii zamiast strcpy i strlen sensowniej jest użyć strcat.

Dałoby się wykorzystać coś takiego:

Dałoby się, choć nie widzę zastosowania dla tej funkcji w twoim przypadku. Jeśli już, to funkcja GetModuleFileName.

0

Motyw z argv[1] chyba nie przejdzie, bo nie odpalam programu konsolowo.

Jak sobie poradzić z tymi funkcjami w WinApi? Przecież wystarczy, żeby jakaś zwróciła ścieżkę w którym folderze jest program odpalany, do tej ścieżki dodałbym nazwę podfolderu i nazwę daty. Tylko jak to zrobić?

0
ShedirAchird napisał(a)

Jak sobie poradzić z tymi funkcjami w WinApi? Przecież wystarczy, żeby jakaś zwróciła ścieżkę w którym folderze jest program odpalany, do tej ścieżki dodałbym nazwę podfolderu i nazwę daty. Tylko jak to zrobić?

nie wiem po cholerę tak kombinujesz, przecież nie podając ścieżki bezwzględnej, automatycznie używasz ścieżki względnej, czyli zwykle względem folderu z którego uruchamiasz program, Ty myślisz, że ludzie się bawią z takimi pierdołkami jak ustawianie pełnej ścieżki, taki mechanizm jest już wbudowany w system...

funkcją GetCurrentDirectory właśnie pobierzesz ścieżkę do folderu względnego, względem którego w programie używasz ścieżek względnych (nie zaczynających się od litery dysku), teoretycznie zwykle do niczego ci to nie jest potrzebne, nie musisz wiedzieć z jakiego folderu został uruchomiony program, żeby używać plików/folderów od gałęzi z tego folderu, innymi słowy to co jest wyżej w systemie plików cię w ogóle nie interesuje, a twój obszar roboczy z plikami zaczynasz od tego folderu początkowego dla twojego programu

char str[512] = "Folder\\"; // folder w katalogu roboczym twojego programu
int offset = strlen(Folder); //offset do początku zapisu

//ustalenie nazwy pliku
time_t rawtime;
tm* timeinfo;
time ( &rawtime );
timeinfo = localtime ( &rawtime );
strftime(str + offset, sizeof(str) - offset, "%H-%M-%S.dat", tm);

//otwarcie pliku
hFile = CreateFile(str, ...); //otwarcie pliku funkcją win32
//lub
std::fstream file(str); //przez stream ceplusowy
//czy tam jeszcze innym cholerstwem, praktycznie w każdym możesz używać ścieżek względnych

mało tego, jeśli plików jest więcej możesz sobie przesunąć katalog roboczy do tego folderu

SetCurrentDirectory("Folder\\"); //wejście w folder 'folder'

char str[512];
//ustalenie nazwy pliku
time_t rawtime;
tm* timeinfo;
time ( &rawtime );
timeinfo = localtime ( &rawtime );
strftime(str, sizeof(str), "%H-%M-%S.dat", tm);

//otwarcie pliku w "Folder\[data].dat"
hFile = CreateFile(str, ...);

//itd

SetCurrentDirectory(".."); //powrót do poprzedniego katalogu

oba kody będą robić to samo

0

^^unknown^^ jesteś wielki. Wystarczyło tylko SetCurrentDirectory("Folder\"). Dokładnie tego szukałem!!!

[browar]
[browar]
[browar]

0

Błąd. Proponuję poczytać czym jest katalog bieżący i jak jest ustawiany przez system. Niekoniecznie musi to być katalog, w którym znajduje się program - taką gwarancję masz tylko wtedy, gdy odpalasz program bezpośrednio przez kliknięcie pliku .exe

Jedyny niezawodny w każdej sytuacji sposób to użycie funkcji GetModuleFileName tak jak podał 0x666 - stąd można otrzymać katalog, w którym znajduje się plik .exe.

Pominę już fakt, że tego w ogóle nie powinno się robić - taki program wywali się od razu pod Vistą i nowszymi na koncie zwykłego uzytkownika (brak praw do zapisu).

0
othello napisał(a)

Błąd. Proponuję poczytać czym jest katalog bieżący i jak jest ustawiany przez system. Niekoniecznie musi to być katalog, w którym znajduje się program - taką gwarancję masz tylko wtedy, gdy odpalasz program bezpośrednio przez kliknięcie pliku .exe

Jedyny niezawodny w każdej sytuacji sposób to użycie funkcji GetModuleFileName tak jak podał 0x666 - stąd można otrzymać katalog, w którym znajduje się plik .exe.

Pominę już fakt, że tego w ogóle nie powinno się robić - taki program wywali się od razu pod Vistą i nowszymi na koncie zwykłego uzytkownika (brak praw do zapisu).

oczywiście, masz rację,
no ale wiesz, autorowi tego wątku spokojnie wystarczy to proste rozwiązanie...

sama funkcja SetCurrentDirectory działa bez problemowo na zwykłym użytkowniku - win7 (przed chwilą sprawdzałem), ścieżka relatywna przełącza się bez żadnego ale... a inna sprawa to tak jak mówisz, może nie być dostępu do folderu, np. do Program Files w którym jest program i tu leży problem, dlatego konfiguracje w programach nie powinny być z programem,
ja generalnie robię w moich dokumentach folder na dane programu i na nim wywołuję SetCurrentDirectory() i to zawsze działa, każdy user ma swój conf i wszyscy zadowoleni,
ale to też nie jest dobre rozwiązanie bo w końcu do konfiguracji programów jest jeszcze specjalny na to folder i przecież tam się powinno to realizować

0

Mam jeszcze jedno pytanie: czy jest jakiś prosty sposób na połączenie wielu plików *.dat, aby wszystkie dane binarne zawrzeć w jednej tablicy? Ewentualnie skleić w jeden zsumowany plik *.dat, który już zostanie odczytany?

Jeszcze jest ten szkopuł, że nazwy plików sumowanych znajdują się w innym pliku, ale tu chyba za pomocą getline da się jakoś to rozwiązać.

Proszę o pomoc.

0
t0m_k napisał(a)

@up Mysle, ze nie ma sensu za kazdym razem pobierac sciezki, bo i po co skoro pliki maja byc w podfoldzerze, wiec sciezka nie jest istotna.

Jakby nie bylo, to od poczatku tlumaczylem, ze nie trzeba calej sciezki ;]

Co do laczenia plikow dat to zalezy co maja zawierac tak na prawde , jesli bedziesz tworzyl plik ze zwyklymi danymi tekstowymi i nadasz po prostu rozszerzenie dat to nie ma problemu z polaczeniem ich w calosc.

Mowisz, ze masz zapisane nazwy w jakims pliku, wiec wlasnie mozesz miedzy innymi getline zastosowac.

Jakbys mial przegladac katalog, a nie brac nazwy z plikow to mozesz sprobowac sprawdzania w petli, czy plik istnieje skoro maja sie skladac z daty, czasu i rozszerzenia.

Probujesz otworzyc, nie stworzyc plik, jesli open zwroci 0 wtedy wiesz ze plik nie istnieje i mozesz zwiekszyc np godzine albo dzien i tak po kolei sprawdzac, z tym ze jest to raczej malo wydajny sposob ;)

Jak masz tylko kilka tych plikow to za pomoca standardowych operacji I/O laczysz.

  1. otwierasz plik, w ktorym ma sie znalezc reszta plikow z flagami O_CREATE + prawa S_Ixxxx, jesli nie ma pliku, a jesli jest to O_RDWR ; open
  2. otwierasz pierwszy plik ktory chcesz wrzucic do glownego pliku O_RDONLY wystarczy
  3. wczytujesz plik do bufora ; read, a bufor tworzysz malloc lub jako tablice czy cos tam innego
  4. zapisujesz dane pliku z drugiego punktu do pliku glownego ; write, fwrite
  5. zamykasz deskryptor z punktu 2 ; close, fclose
  6. powtarzasz punkty 2,3,4,5 do konca plikow
  7. zamykasz deskryptor z punktu 1

W przypadku winapi beda to funkcje:
CreateFile, ReadFile, WriteFile, itp, flag i atrybutow nie znam na pamiec ale mysle ze sobie poradzisz

Jesli chodzi o inne laczenie to pomoze Ci na pewno ta strona:
http://www.wotsit.org/list.asp?search=dat&button=GO!
oraz poszukaj informacji o binderach, jesli w ogóle istnieja do plikow tego typu ;p

1 użytkowników online, w tym zalogowanych: 0, gości: 1