c++ Odczytywanie z otwartego pliku

Odpowiedz Nowy wątek
2015-01-20 01:25
0

Jak odczytać nazwę pliku gdy jest otwarty ? Ta sama funkcja zależnie od wybranej opcji działa na jednym z 2 plików. Wewnątrz musi się znaleźć sprawdzenie na którym działa. Przejrzałem forum i nic o tym nie znalazłem.

Pozostało 580 znaków

2015-01-20 09:46
0

przeciez musisz podac parametr CO otwierasz. Tam masz swoja nazwe ;)

Pozostało 580 znaków

2015-01-20 09:58
1

fstream nie przechowuje nazwy/ścieżki pliku. Sam musisz zapamiętać nazwę gdy otwierasz taki plik.

moze tez korzystac z FILE ;) ale tak jak mowisz, nie ma mozliwosci odczytania nazwy pliku, dlatego zasugerowalem ze moze odczytac co otworzyl bo musi to podac przed otwarciem - fasadin 2015-01-20 10:01
O.o Przecież takich stringów nie podaje się inline o.O - Ola Nordmann 2015-01-20 12:20
zmienną też może zapamiętać - twonek 2015-01-20 12:31
fopen( assets.get("przyjazna nazwa") ) takie coś da się zrobić nawet metaprogramowaniem w C++. - Ola Nordmann 2015-01-20 13:34

Pozostało 580 znaków

2015-01-20 10:13
0

W standardowym C++ raczej nie da się tego sprawdzić.
Poza standardowym C++ jest to raczej wykonalne (np Qt).


Jeśli chcesz pomocy, NIE pisz na priva, ale zadaj dobre pytanie na forum.
sadze ze dalby rade sprawdzic jezeli ktos bardzo by chcial, bylo by to platform-specific aleee, wierze ze jest jakies obejscie problemu ze mozna odczytac nazwe pliku (np skoro mamy pointer do tego gdzie wskazuje to moglibysmy zapytac system gdzie ten plik sie znajduje na dysku, i powinna nazwa juz byc ;) Ale na 99% nie jest to potrzebne skoro trzeba przekazac sciezke do pliku ;) - fasadin 2015-01-20 10:25

Pozostało 580 znaków

2015-01-20 13:08
2

Zaczynam więc kopać. Konstruktor ofstream:

explicit basic_ofstream(const char *_Filename,
    ios_base::openmode _Mode = ios_base::out,
    int _Prot = (int)ios_base::_Openprot)
    : _Mybase(&_Filebuffer)
    {   // construct with named file and specified mode
    if (_Filebuffer.open(_Filename, _Mode | ios_base::out, _Prot) == 0)
        _Myios::setstate(ios_base::failbit);
    }

Widać tutaj, że nazwa pliku idzie do metody _FileBuffer.open. Poza tym nic się z nią nie dzieje, więc kopiemy dalej.

_Myfb *rdbuf() const
{   // return pointer to file buffer
return ((_Myfb *)&_Filebuffer);
}

Na początek oczywiście sprawdzam, czy _FileBuffer jest dostępne z zewnątrz. Powyższa metoda jest oczywiście publiczna.

_Myt *open(const char *_Filename,
    ios_base::openmode _Mode,
    int _Prot = (int)ios_base::_Openprot)
    {   // open a C stream with specified mode
    _Filet *_File;
    if (_Myfile != 0 || (_File = _Fiopen(_Filename, _Mode, _Prot)) == 0)
        return (0); // open failed

    _Init(_File, _Openfl);
    _Initcvt(&_USE(_Mysb::getloc(), _Cvt));
    return (this);  // open succeeded
    }

Powyżej widać definicje metody _FileBuffer.open. Widzimy, że nazwa pliku jest przekazywana tylko do funkcji _Fiopen. Rezultat jest prekazywany do metody _Init. Sprawdziłem co się tam dzieje. Rezultat jest zapisywany w zmiennej prywatnej nieudostępnianej nikomu, nigdy, nigdzie. Z czystej programistycznej ciekawości sprawdziłem co się dzieje z nazwą pliku:

extern _MRTIMP2_NCEEPURE _Filet *__CLRCALL_PURE_OR_CDECL _Fiopen(
    const char *,
    ios_base::openmode, int);

Mamy tutaj funkcję biblioteczną, która zwraca dziwny typ. Szybko go zidentyfikowałem:

#define _Filet _iobuf

A stąd prosta droga do:

struct _iobuf {
        char *_ptr;
        int   _cnt;
        char *_base;
        int   _flag;
        int   _file;
        int   _charbuf;
        int   _bufsiz;
        char *_tmpfname;
        };
typedef struct _iobuf FILE;

Odpowiedź: Mimo, że to jest głupie to sprawdziłem i nie da się tego zrobić. (kształt struktury...)


Pozostało 580 znaków

2015-01-20 13:22
0

Z premedytacją zrobiłem drugi post, coby nie pomieszać wątków. Lecimy teraz z rozwiązaniami platform dependent:

Windows (tak - wiem, że to nic nie zdziała przy FILE*, ale zaraz sprawdzę jak jest wypełniana struktura FILE i jak wygląda windowsowski HANDLE dla pliku.):
http://msdn.microsoft.com/en-[...]rary/aa366789%28VS.85%29.aspx

Lunix:
http://stackoverflow.com/ques[...]me-from-a-file#answer-4862476


edytowany 1x, ostatnio: Ola Nordmann, 2015-01-20 13:22
tylko ze ja dokladnie o tym pisalem ze sie da, ale zapewne to jest bezsensu ;) - fasadin 2015-01-20 13:24
Ja bym powiedział, że to jest po prostu głupie. Ale z ciekawości sobie zobaczę jak to działa :) - Ola Nordmann 2015-01-20 13:29
to jest nawet nie platform, co version dependent bo MS nie boi się zmieniać struktur systemowych pomiędzy wersjami. - Azarien 2015-01-21 13:02

Pozostało 580 znaków

2015-01-21 12:01
0

Dzięki wielkie za wszystkie odpowiedzi. Będę zajmował się tym w weekend to napiszę w razie problemów.

Pozostało 580 znaków

Odpowiedz
Liczba odpowiedzi na stronę

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