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.
przeciez musisz podac parametr CO otwierasz. Tam masz swoja nazwe ;)
fstream
nie przechowuje nazwy/ścieżki pliku. Sam musisz zapamiętać nazwę gdy otwierasz taki plik.
W standardowym C++ raczej nie da się tego sprawdzić.
Poza standardowym C++ jest to raczej wykonalne (np Qt).
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...)
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-us/library/aa366789%28VS.85%29.aspx
Dzięki wielkie za wszystkie odpowiedzi. Będę zajmował się tym w weekend to napiszę w razie problemów.